Excel用のかなりインテリジェントなマクロを作成しようとしています。この例では、情報を転送する2つの別個のワークブックがあります。最初のワークブックには、列Aに日付のリストがあり、その後に次の列に対応する値が続きます。そのようです:
ご覧のとおり、日付と値は一貫して入力されていません。特定の日のみご利用いただけます。現在のエントリは2012年の終わりに停止します。このマクロのポイントは、毎月新しい番号を追加することです。
ワークブック2からの抜粋は次のようになります。
私の現在のマクロは現在、ワークブック2で正しい値を見つけて、それらをワークブック1にコピーします。これは、日付が一致しない可能性があることを除けば素晴らしいことです。「CMP(3年)」セクションには15日分の値がありますが、「CMP(4年)」セクションには14日分しかありません。それらの値を盲目的にシート1にコピーすると、正しく整列しません。日付が欠落している場合は、計算された平均があるほうがいいです
したがって、この問題を解決するために、私は現在の解決策を試みています:
'Grab 1 Month
Call Import("CMA/FIXED (4 WEEKS)", "B1", DestinationWorkbook, ExportedWorkbook, 3, 2, False, DestinationDateRange)
上記のメソッドは、日付を抽出するだけでなく、検索する数値の各列に対して呼び出されます。
以下で何が起こっているのかを説明させてください。最初に、2番目のシートで検索する文字列が渡されます。これは、正しい値を見つけるためにxおよびyオフセット整数と組み合わせて使用されます。DestinationSheetNameはWorkbook1で、ExportedDataSheetNameはWorkbook2です。isDateImportブール値は、これが最初のインポートであり、取得しているのはWorkbook1の列Aに追加される最初の日付のセットであることをメソッドに通知するためにあります。ByRef DateRangeは、Workbook1の列Aにコピーして貼り付けた後の日付へのポインターです。したがって、これが最初に日付に使用される場合、これは明らかにnullです。
そこから、どのようなインポートを行っているかを確認します。日付の場合は、単純な検索、コピー、貼り付けを行います。そうでない場合は、検出された値のインテリジェントなインポートを試みます。アイデアは、両方の日付セット、workbook1の列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