2016-07-14 5 views
0

Dies ist mein allererstes VBA-Programm und post hier so nimm es einfach: D. Ich bin ein Sommer Praktikant in der AeroSpace Abteilung arbeiten, unser Projekt ist derzeit beteiligt heavvy Satellitenproduktion und ich bin verantwortlich für die Lieferung der Enddaten Datenpaket an unseren Kunden. Eines dieser Ergebnisse enthält ein so genanntes As Design As Build. Im Wesentlichen habe ich ein Makro, das P/N in einem Blatt zu einem anderen Blatt sucht. Beide sind Controller durch einen Zähler, x ist der Zähler für das Bom-Blatt und y ist der Zähler für das Master-Blatt. Wenn die P/N gleich sind, kopiert es einige Zellen von der Stückliste auf das Masterblatt. Hier ist die Stückliste das ständig wechselnde Blatt und der Master ist das, was jedes Fahrzeug haben soll. Fehlende Gegenstände sind mein Problem hier. Ich habe es so codiert, dass fehlende Elemente in der Stückliste einfach übersprungen werden und eine Leerstelle hinterlassen wird. Wenn sich jedoch ein Element in der Stückliste befindet, das sich nicht auf dem Master befindet, durchsucht es alle Zeilen, trifft das Ende und bricht dann ab. Ich habe das Hinzufügen dieser versucht, es zu begegnen, aber es scheint nicht zu funktionieren:VBA Suchen nach P/N in zwei Blättern und Kopieren von Daten

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

Ich bin ziemlich viel versucht, den x-Wert zu stoßen oder eine Zeile auf dem Bom Blatt nach unten zu bewegen, wenn der y-Wert hat erreichte das Ende des Masterblatts, um die Schleife fortzusetzen. Jede Hilfe/Kritik wäre großartig! Sub ADAB() ‚Need Meister und Bom Arbeitsblatt

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

Wenn es bricht, wirft es einen Fehler? Um nur darauf hinzuweisen, müssen Sie das Arbeitsblatt vor 'Cells()' einfügen, genau wie Sie es mit 'Range()' gemacht haben, sonst können Sie unerwartete Ergebnisse erhalten. – BruceWayne

+0

Es gibt keinen Fehler, aber der gesamte Such-/Kopiervorgang wird gestoppt. Ich werde die Arbeitsblätter vor den Zellen hinzufügen. –

Antwort

0

Ich sehe nicht die Notwendigkeit, halten Sie Ihre Blätter "Aktivieren". Sie sollten wahrscheinlich nur Objekte erstellen ... es wird Ihr Leben leichter

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

Dann können Sie es nur als „Master“ ab dann beziehen machen.

master.cells(x,1) = foo 

Was Ihre Fragen halte ich könnte eine Reihe von P/Ns machen, dann durch den Master-Looping und auf der Suche nach Übereinstimmungen ... scheint, wie Sie zu viel für eine kleine Schleife versuchen zu erreichen! Es ist schwer zu sagen von Ihrer Beschreibung, nur meine zwei Cent!

+0

Danke für den Objekt-Tipp, der sich als nützlich erweisen wird. Ich versuche immer noch, die Grundlagen zu lernen, also habe ich eine Menge der Aktivierungen abgegeben, nur um sicher zu gehen. Anstatt also den Master zu suchen, benutzen Sie den Master und suchen Sie die Stückliste? Ich muss sehen, ob das für das Projekt machbar ist, jedes Fahrzeug unterscheidet sich geringfügig in den Dingen, auf denen es steht. –

0

Nach ein wenig Optimierung konnte ich mein Problem beheben. Durch Zuweisen von z = y vor y Inkrementen wirkt z in der ElseIf-Anweisung als 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 

Dies war in der Lage, durch das gesamte Dokument zu durchlaufen und wurde nicht auf irgendwelche Gegenstände eingeholt. Vielen Dank für Ihre Kommentare!