0

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
4

1 に答える 1

0

set範囲を段階的に増やすには、増分ポインタセクションで使用する必要があります。そうしないと、次のセルから現在のセルに値をコピーするだけです。

'increment Pointers 
Windows(ExportedDataSheetName).Activate 
Set DateColumnPointer = DateColumnPointer.Item(2, 1)

Windows(DestinationSheetName).Activate 
Set DateRangePointer = DateRangePointer.Item(2, 1)

私があなたの質問の要点を見逃していない限り?

于 2013-02-27T11:58:10.247 に答える