2017-11-27 15 views
0

1つのワークシート内の発注書テンプレートから、同じExcelワークブック内のすべての発注書日付を記録するデータベースワークシートにエントリを引き出します。注文テンプレートタブで注文されたSKUは、1を超えることが多く、お互いに異なります。以下のVBAコードを編集してデータベース]タブに異なるSKU番号のを引っ張っする方法を疑問に思う:Excel VBA DoWhileループ - 各ループで項目のリストを返す方法は?

Private Sub CommandButton1_Click() 
    Dim OrderDate As String, PONumber As String, Vendor As String, ShipTo As String, SKU As String 
    Worksheets("Order Form 1").Select 
    OrderDate = Range("B3") 
    PONumber = Range("D3") 
    Vendor = Range("B7") 
    ShipTo = Range("D7") 
    SKU = Range("F3") 
    R = 3 
    Do While Cells(R, 6) <> "" 
     Worksheets("Database").Select 
     Worksheets("Database").Range("A1").Select 
     If Worksheets("Database").Range("A1").Offset(1, 0) <> "" Then 
      Worksheets("Database").Range("A1").End(xlDown).Select 
     End If 
     ActiveCell.Offset(1, 0).Select 
     ActiveCell.Value = OrderDate 
     ActiveCell.Offset(0, 1).Select 
     ActiveCell.Value = PONumber 
     ActiveCell.Offset(0, 1).Select 
     ActiveCell.Value = Vendor 
     ActiveCell.Offset(0, 1).Select 
     ActiveCell.Value = ShipTo 
     ActiveCell.Offset(0, 1).Select 
     ActiveCell.Value = SKU 
     Worksheets("Order Form 1").Select 
     R = R + 1 
    Loop 
End Sub 
+0

は基本的に2がありますワークブック?エラーの可能性を少なくするためには、 '.Select'とジェネリック' Range(...) '、' 'ActiveCell''を捨てなければなりません。あなたの目標に到達する1つの方法は、2つのワークブック/ワークシート変数を作成し、オフセット/ 2つのロング変数を作成して、処理している行を保存することです。 – PatricK

+0

1)オーダーシートに複数のSKUが格納されている場所を明確にしてください。2) ""ではなくvbNullstringを使用してください。3)既存の値を上書きしないようにしてください。書き込む次の使用可能な行を見つける必要があります。 – QHarr

答えて

0

は私が.SelectsとのActiveCell参照の全てが醜いことに同意します。

Private Sub CommandButton1_Click() 
    Dim OrderDate As String, PONumber As String, Vendor As String, ShipTo As String, SKU As String 
    Dim R As Long, LastRow As Long 
    Worksheets("Order Form 1").Select 
    OrderDate = Range("B3") 
    PONumber = Range("D3") 
    Vendor = Range("B7") 
    ShipTo = Range("D7") 
    LastRow = Worksheets("Order Form 1").Cells(Worksheets("Order Form 1").Rows.Count, "F").End(xlUp).Row 
    For R = 3 To LastRow 
     SKU = Range("F" & R).Value 
     Worksheets("Database").Select 
     Worksheets("Database").Range("A1").Select 
     If Worksheets("Database").Range("A1").Offset(1, 0) <> "" Then 
      Worksheets("Database").Range("A1").End(xlDown).Select 
     End If 
     ActiveCell.Offset(1, 0).Select 
     ActiveCell.Value = OrderDate 
     ActiveCell.Offset(0, 1).Select 
     ActiveCell.Value = PONumber 
     ActiveCell.Offset(0, 1).Select 
     ActiveCell.Value = Vendor 
     ActiveCell.Offset(0, 1).Select 
     ActiveCell.Value = ShipTo 
     ActiveCell.Offset(0, 1).Select 
     ActiveCell.Value = SKU 
     Worksheets("Order Form 1").Select 
    Next R 
End Sub 

そして、ここでは.SelectsとActiveCellの参照を排除するための努力です::しかし、可能性として単独であなたのコードの多くを残してしようとする際に、ここに一つの方法である

Private Sub CommandButton1_Click() 
    Dim OrderDate As String, PONumber As String, Vendor As String, ShipTo As String, SKU As String 
    Dim R As Long, LastSKURow As Long, NextDBRow As Long, OFrm As Worksheet, DB As Worksheet 
    Set OFrm = Worksheets("Order Form 1") 
    Set DB = Worksheets("Database") 
    OrderDate = OFrm.Range("B3") 
    PONumber = OFrm.Range("D3") 
    Vendor = OFrm.Range("B7") 
    ShipTo = OFrm.Range("D7") 
    LastSKURow = OFrm.Cells(OFrm.Rows.Count, "F").End(xlUp).Row 
    For R = 3 To LastSKURow 
     SKU = OFrm.Range("F" & R).Value 
     NextDBRow = DB.Cells(DB.Rows.Count, "A").End(xlUp).Row + 1 
     DB.Range("A" & NextDBRow).Value = OrderDate 
     DB.Range("B" & NextDBRow).Value = PONumber 
     DB.Range("C" & NextDBRow).Value = Vendor 
     DB.Range("D" & NextDBRow).Value = ShipTo 
     DB.Range("E" & NextDBRow).Value = SKU 
    Next R 
End Sub 
+0

TLEMaster、ありがとう - これは魅力的なように機能しました - 要約版です。注文後にオーダーフォームからデータを消去するための再設定命令を作成することができますか?また、コマンドボタンをクリックするだけで、pdf形式で自動保存することもできます。私はあなたのスキルに感心しています - そして、あなたの助けに非常に感謝します! –

+0

こんにちはエリック、これはあなたのために働いてうれしい。あなたの他のご要望については、マクロレコーダーを使ってお手伝いしてください。右クリックして「内容を消去」を選択します。別の場所にPDFとして保存する場所を記録します。それは、あなたを始めるためのコードを生成します。 – tlemaster

+0

TLEMaster、私はあなたが作成されたコードを見て、あなたは私にどこに切断されているか教えてもらえますか?それは私が識別することができないバグがあると述べています。ありがとうございました! –

関連する問題