我正在嘗試爲Excel編寫一個相當智能的宏。在這種情況下,我有兩個獨立的工作簿,我正在傳遞信息。第一個工作簿在列A中列出日期,並在以下列中列出相應的值。像這樣:根據日期導入值:Excel宏
正如你所看到的,日期和值不會一致地輸入。他們只在某些日子可用。目前的條目在2012年底停止。這個宏的要點是每月增加新的數字。
摘錄從工作簿2看起來是這樣的:
我目前的宏觀當前所在的工作簿2和拷貝正確的價值觀他們綜合練習1 除了日期不一致的可能性,這是偉大的。 「CMP(3年)」部分可能有15天的價值,但「CMP(4年)」部分只有14天的價值。如果我盲目地將這些值複製到一張紙上,他們將不能正確排列。我寧願會有一個計算的平均,如果日期是缺少
因此,要解決這個問題,我試圖在當前的解決方案:
'Grab 1 Month
Call Import("CMA/FIXED (4 WEEKS)", "B1", DestinationWorkbook, ExportedWorkbook, 3, 2, False, DestinationDateRange)
上述方法被調用號碼中的各個列位於以及提取日期。
請允許我解釋下面應該發生的事情。首先在第二張表中搜索的字符串被傳入。這與x和y偏移整數一起使用來定位正確的值。 DestinationSheetName是Workbook1,而ExportedDataSheetName是Workbook2。 isDateImport布爾值在那裏告訴方法,這是第一次導入,我們所抓取的是將被添加到Workbook1的列A的第一組日期。 ByRef DateRange是複製並粘貼到Workbook1的A列後指向這些日期的指針。所以很顯然,當它最初用於日期時,這是空的。
從那裏我們檢查我們正在做什麼樣的導入。如果是日期,我們只需簡單地查找,複製和過去。如果不是,我們嘗試對定位值進行智能導入。這個想法是創建一個指向兩組日期的指針,工作簿1中列A中的日期以及與我們正在複製的值對應的日期。我們希望粘貼位置在每個日期的正確行中。我創建了兩個指針,並在兩個日期列的開始處指向它們。代替複製粘貼代碼,我只是打印到調試窗口。如果指針值彼此匹配。比較日期後,我嘗試將指針遞增到日期列中的下一個值。
這對於2日期很好,然後當我嘗試增加指針時出現錯誤。
我該如何解決這個錯誤?或者是有一個更簡單的方法來做到這一點?......我知道指針是Excel電子表格有點矯枉過正...
Sub Import(SearchString As String, PasteLocation As String _
, DestinationSheetName As Variant _
, ExportedDataSheetName As Variant, xOffset As Integer, yOffset As Integer _
, isDateImport As Boolean, ByRef DateRange)
Windows(DestinationSheetName).Activate
Set newSpot = Range(PasteLocation).End(xlDown)
newSpot.Select 'remove
Set newSpot = newSpot.Item(2, 1)
Windows(ExportedDataSheetName).Activate
Cells.Find(What:=SearchString, After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Activate
ActiveCell.Select
If Not isDateImport Then
'intelligent import
Set datesColumn = ActiveCell.Item(xOffset, yOffset)
datesColumn.Select 'remove
Set valuesColumn = datesColumn.Item(1, 2)
valuesColumn.Select 'remove
Set datesColumn = Range(datesColumn, datesColumn.End(xlDown))
datesColumn.Select 'remove
Set valuesColumn = Range(valuesColumn, valuesColumn.End(xlDown))
valuesColumn.Select 'remove
Set DateColumnPointer = datesColumn.Item(1, 1)
DateColumnPointer.Select 'remove
Set DateRangePointer = DateRange.Item(1, 1)
Windows(DestinationSheetName).Activate
DateRangePointer.Select 'remove
For Each cell In valuesColumn
If (DateColumnPointer = DateRangePointer) Then
Debug.Print "Same"
Else
Debug.Print "Different"
End If
'increment Pointers
Windows(ExportedDataSheetName).Activate
DateColumnPointer = DateColumnPointer.Item(2, 1)
Windows(DestinationSheetName).Activate
DateRangePointer = DateRangePointer.Item(2, 1)
Next
Else
'primitive import
Set cell1 = ActiveCell.Item(xOffset, yOffset)
If isDateImport Then
Set cell2 = cell1.End(xlDown)
Else
Set cell2 = cell1.End(xlDown).End(xlToRight)
End If
Set rng = Range(cell1, cell2)
rng.Select
rng.Copy
Windows(DestinationSheetName).Activate
If isDateImport Then
Range("W1").Select
Else
Range("V1").Select
End If
ActiveSheet.Paste
'Add grabbed values
Set numbers = Range(Range("W1"), Range("W1").End(xlDown))
numbers.Copy
newSpot.PasteSpecial xlValues
End If
Windows(ExportedDataSheetName).Activate
Range("A1").Select
End Sub
你是否在子例程外全局設置了這些變量? – glh 2013-02-27 11:27:57