2016-07-14 10 views
0

これは私の最初のVBAプログラムです。 私はAeroSpace部門で働く夏期インターンです。私たちのプロジェクトでは頭が掛かっている衛星生産が含まれており、私は最終品目データパッケージを顧客に引き渡しています。 これらの成果物の1つに、As Design As Buildと呼ばれるものが含まれています。 本質的には、P/Nをあるシートで別のシートに検索するマクロを作成しました。どちらもコントローラでカウンタ、xはBomシートのカウンタ、yはマスタシートのカウンタです。 P/Nが等しい場合、BOMからマスターシートにいくつかのセルがコピーされます。 ここでBOMは絶えず変化するシートであり、マスターは各車両が持つべきものです。 不足している項目が私の問題です。私はそれをコード化しましたので、BOMの不足しているアイテムは、マスターで空白を残してスキップされます。ただし、マスタにないアイテムがBOMにある場合は、すべての行を検索し、最後にヒットしてからブレークします。私はそれに対抗するためにこれを追加しようとしたが、それは動作していないようです:私はかなりのx値をバンプまたはyの値がある場合はボムシート上の行を下に移動しようとしているVBA 2枚のシートでP/Nを検索し、データをコピー

Else 
    y = y + 1 
    If (y = FinalRow) Then 
    x = x + 1 

ループを続けるためにマスターシートの終わりに達しました。 助けや批判はすばらしいでしょう! サブADABは() は、「私はあなたのシートを 『活性化』に維持する必要性を参照してくださいいけないマスターとBOMのワークシート

Dim dataFile As String 
Dim WB As Workbook 
Dim x As Integer 
Dim y As Integer 
Dim iFound As Integer 
Dim BomValue As String 
Dim MasterValue As String 

'Set variables 
Workbooks("ADAB Tool.xlsm").Activate 
dataFile = Cells(1, 1).Value 
Set WB = Workbooks.Open(Filename:=dataFile, ReadOnly:=False) 
'Open workbook from path 

    Worksheets("Master").Activate 
    FinalRow = Cells(Rows.Count, 1).End(xlUp).Row 
    y = 2 
    x = 2 
Do While (y <= FinalRow) 
    Workbooks("ADAB1.xlsx").Activate 
    Worksheets("Bom").Activate 
    BomValue = Worksheets("Bom").Cells((x), 1).Value 
     MasterValue = Worksheets("Master").Cells((y), 1).Value 
     iFound = 0 
     If (BomValue = MasterValue) Then 
      Worksheets("Master").Activate 
      Worksheets("Bom").Activate 
      Dim Range As Range 
      Set Range = Worksheets("Bom").Range(Cells(x, 1), Cells(x, 4)) 
      Worksheets("Master").Activate 
      Worksheets("Master").Range(Cells(y, 3), Cells(y, 6)) = Range.Value 
      iFound = 1 
      x = x + 1 
      y = y + 1 
     Else 
      y = y + 1 
      If (y = FinalRow) Then 
      x = x + 1 
     End If 
    End If 
Loop 
End Sub 
+0

壊れたときはエラーになりますか?また、単に 'Range()'と同じように 'Cells()'の前にワークシートを追加する必要があります。そうしないと、予期しない結果が得られます。 – BruceWayne

+0

エラーは発生しませんが、検索/コピー処理全体が停止します。私はセルの感謝の前にワークシートを追加します。 –

答えて

0

が必要です。あなたはおそらく、オブジェクトを作成する必要があります...それはあなたの人生を容易

dim master as worksheet 
set master = thisworksbook.worksheets("master") 

を行いますその後、あなたはその後、上からのみ「マスター」としてそれを参照することができます。ご質問については

master.cells(x,1) = foo 

、私はその後、マスターをループしてマッチを探して、P/N S個の配列を作る考慮するかもしれない...あなたは一つの小さなループのためにあまりにも多くを達成しようとしているように思えます!あなたの説明からそれを伝えるのは難しいが、ちょうど私の2セント!

+0

便利なオブジェクトチップをありがとう。それでも基本を学びたいので、安全のためだけに多くのアクティベイトを投げました。マスターを検索する代わりに、マスターを使用してBOMを検索しますか?私はそれがプロジェクトのために実現可能かどうかを見なければならないでしょう、それぞれの車両は、それが持っている項目でわずかに異なります。 –

0

ちょっと微調整して問題を解決できました。 yをインクリメントする前にz = yを代入すると、ElseIf文でzがy = y-1として機能します。

If (BomValue = MasterValue) Then 
     Worksheets("Master").Activate 
     Worksheets("Bom").Activate 
     Dim Range As Range 
     Set Range = Worksheets("Bom").Range(Cells(x, 1), Cells(x, 4)) 
     Worksheets("Master").Activate 
     Worksheets("Master").Range(Cells(y, 3), Cells(y, 6)) = Range.Value 
     iFound = 1 
     z = y 
     x = x + 1 
     y = y + 1 
    ElseIf (y >= FinalRow And x < FinalRowBom) Then 
     x = x + 1 
     y = z 
    Else 
     y = y + 1 
    End If 
Loop 

これはドキュメント全体をループすることができ、どの項目にも巻き込まれませんでした。 コメントありがとうございます!

関連する問題