0

Work、Bill、Cust の 3 つのシートがあります。Cust 列 A には私の固有の顧客が含まれています。これを Work シートのセル A3 に貼り付けて計算を実行し、それを Bill シートに貼り付けます。次に、Cust シートの次の値を取り、Work に貼り付けて計算を実行し、Bill シートの前のセットの下に貼り付けます。2 つの質問があります。

ループが機能しないのはなぜですか? 顧客シートの顧客がなくなるまで続けるつもりですか?コードの最初の部分でカスタム範囲 BillPlace を使用できるのに、後の部分で実際にセルを参照する必要があるのはなぜですか? 前もって感謝します

Sub test1()
    Dim WorkPlace As Range, BillPlace As Range, WorkProd As Range

    Set WorkPlace = Sheets("Work").Cells(3, 1)
    Set BillPlace = Sheets("Bill").Cells(3, 1)
    Set WorkProd = WorkPlace.CurrentRegion

    WorkPlace.CurrentRegion.Copy
    BillPlace.PasteSpecial xlPasteAll

    Sheets("Cust").Select
    Cells(1, 1).Copy
    WorkPlace.PasteSpecial xlPasteAll

    WorkProd.Copy
    Sheets("Bill").Select
    Range("A3").Select
    Selection.End(xlDown).Select
    Selection.Offset(1, 0).PasteSpecial xlPasteAll
    Sheets("Cust").Select
    Cells(2, 1).Select
    Selection.Offset(1, 0).Select

    Do
        ActiveCell.Offset(1, 0).Copy
        WorkPlace.PasteSpecial xlPasteAll
        WorkProd.Copy
        Sheets("Bill").Select
        Range("A3").Select
        Selection.End(xlDown).Select
        Selection.Offset(1, 0).PasteSpecial xlPasteAll
    Loop Until IsEmpty(ActiveCell.Offset(1, 0))
End Sub
4

3 に答える 3

2

For Each@Portland Runner には、 /Nextループの使用に関するポイントがあります。そうすることで、おそらく上記の作業コードからカウンターと一連の選択を排除し、プロセスから一連の複雑さを取り除くことができます。

For/Next ループの原則は簡単です。ループするセルを含む TheLargerRange を定義します。作業中の現在のセルを含む SingleCell 範囲を定義します。次に、次のように言ってループを開始できます。

For Each SingleCell in TheLargerRange 
    '~~> your loop actions go here 
Next SingleCell

また、ブック内の特定の場所を選択しなくても、多くのことができます。代わりに、場所を参照するだけで値をコピー、貼り付け、または割り当てます。必要に応じて、変数を設定して、長いコードでこれを簡単にすることができます。

次の例では、顧客データの列をあるシートから別のシートに移動するだけです。これは、For Each/Nextループ構造を使用する方法と、作業するすべてのものを選択しないようにする方法の例です。このコードには 1 つの選択しかありません。これEnd(xldown)は、選択されていないタブで範囲を設定しようとすると、コンパイラがチョークするためです。そうでなければ、選択はありません。

Sub UsingForNextAndAvoidingSelections()

    '~~> Set variables for referencing the "Cust" tab
        Dim CustomerList As Range
        Dim Customer As Range
        Dim CustomerTab As Worksheet

        Set CustomerTab = Sheets("Cust")
        CustomerTab.Select
        Set CustomerList = CustomerTab.Range("A1", Range("A1").End(xlDown))

    '~~> Set variables for referencing the "Bill" tab
        Dim BillTab As Worksheet
        Dim BillRow As Range

        Set BillTab = Sheets("Bill")
        Set BillRow = BillTab.Range("A1")

    '~~> Loop through the customer list, copying each value to the new BillRow location
        For Each Customer In CustomerList
            Customer.Copy
            BillRow.PasteSpecial xlPasteAll
            Set BillRow = BillRow.Offset(1, 0)
        Next Customer

End Sub

2013 年 12 月 27 日: CustomerTab が選択されていないときにコードがエラーをスローする理由に気付きましたSet CustomerList = CustomerTab.Range("A1", Range("A1").End(xlDown)): その行の 2 番目の範囲ステートメントを完全に修飾するのを忘れていました: Range("A1").End(xlDown)

そのコード行をこのように修飾すると、その前にあるSet CustomerList = CustomerTab.Range("A1", CustomerTab.Range("A1").End(xlDown))を削除しCustomerTab.Selectて、単一のSelect.

于 2013-10-16T02:18:39.240 に答える
1
     WorkProd.Copy
    Sheets("Bill").Select
    Range("A3").Select
    Selection.End(xlDown).Select
    Selection.Offset(1, 0).PasteSpecial xlPasteAll
Loop Until IsEmpty(ActiveCell.Offset(1, 0))

列の最後に移動し、さらに 1 行下に貼り付けます。次に、1 行下のセルが空であるかどうかを確認しますが、貼り付けたばかりなので空ではありません。無限に繰り返すのはこのためです。

現在のカーソル位置の 1 行下以外の空のセルを探す必要があると思います。

于 2013-10-15T18:50:33.367 に答える
0

はっ!それを私が直した。これは最も正統なアプローチではありませんが、うまくいきました。申し訳ありませんが、本番環境で行ったため、シートの名前とセルの位置がわずかに変更されました。CountC は、顧客の数をカウントするヘルパー セルです。助けてくれてありがとう。

Sub Pull_Billing()
    Dim WorkPlace As Range, BillPlace As Range, WorkProd As Range, PlaceHolder As Range, CountC As Integer, n As Integer


    Set WorkPlace = Sheets("Work").Cells(3, 1)
    Set BillPlace = Sheets("ABS_Billing_Sheet").Cells(3, 1)
    Set WorkProd = WorkPlace.CurrentRegion
    CountC = Sheets("CTA_Info").Cells(1, 5).Value


    Sheets("CTA_info").Cells(2, 2).Copy
    WorkPlace.PasteSpecial xlPasteAll
    WorkPlace.CurrentRegion.Copy
    BillPlace.PasteSpecial xlPasteAll
    Sheets("CTA_Info").Select
    Cells(3, 2).Copy
    WorkPlace.PasteSpecial xlPasteAll


    WorkProd.Copy
    Sheets("ABS_Billing_Sheet").Select
    Range("A3").Select
    Selection.End(xlDown).Select
    Selection.Offset(1, 0).PasteSpecial xlPasteAll


    Sheets("CTA_Info").Select
    Cells(4, 2).Select
    n = ActiveCell.Row
    Do
    Cells(n, 2).Select
    Selection.Copy
    WorkPlace.PasteSpecial xlPasteAll
    WorkProd.Copy
    Sheets("ABS_Billing_Sheet").Select
    Range("A3").Select
    Selection.End(xlDown).Select
    Selection.Offset(1, 0).PasteSpecial xlPasteAll
    Sheets("CTA_Info").Select
    Cells(n + 1, 2).Select
    n = ActiveCell.Row
    Loop Until n > CountC + 2


    Sheets("CTA_info").Cells(2, 2).Copy
    WorkPlace.PasteSpecial xlPasteAll


    Sheets("ABS_Billing_Sheet").Select



    End Sub
于 2013-10-15T22:28:54.680 に答える