2016-03-30 14 views
1

ich zwei Arbeitsmappen haben, wir nennen sie Workbook1 und Workbook2VBA - Matchdaten aus einem anderen Arbeitsblatt basierend auf Kriterien

Workbook1: sieht wie folgt aus: (Ich habe Daten in Spalte A)

Facility Name| Column B| Column C | 
    TGG751-M |   |   | 
    TGG760-M |   |   | 
    TLY701-M |   |   | 

Workbook 2:

Technology| Facility Name |  Remarks  | 
LTE  | TGG751-M  | 91%-100% utilization | 
LTE  | TGG760-M  | 91%-100% utilization | 
LTE  | TLY701-M  |   Red   | 

brauche ich Facility Name in beiden Arbeitsmappen entsprechen und wenn der Remarks der übereinstimmenden Facility Name ist 91%-100% utilization, die two columns in WorkBook2 hinzugefügt und als Selected und For Checking markiert ist.

würde die Ausgabe so sein ..

Technology | Facility Name |  Remarks  | +1 Column | +1 Column 
    LTE  | TGG751-M | 91%-100% utilization | Selected | For Checking 
    LTE  | TGG760-M | 91%-100% utilization | Selected | For Checking 
    LTE  | TLY701-M |   Red   |   | 

Mein Code:

Public Sub Selection() 

Set WorkBook1 = Workbooks.Open(TextBox2.Text).Sheets(1) 
Set WorkBook2 = Workbooks.Open(TextBox5.Text).Sheets(1) 

     lngLastRow = WorkBook1 .Range("A" & WorkBook1 .Rows.Count).End(xlUp).Row 

For Index = 2 To lngLastRow 

    Dim varFacility As Variant 
    Dim facilityRng As Range 

    On Error Resume Next 

     lngLastRow = WorkBook1 .Range("A" & WorkBook1 .Rows.Count).End(xlUp).Row 
     Set facilityRng = WorkBook1 .Range("A1:A" & lngLastRow) 

     varFacility = WorkBook1 .Range("A" & rownum).Value 
     varPosition = Application.WorksheetFunction.Match(varFacility, facilityRng, 0) 

    If Err = 0 Then 

     WorkBook1 .Range("A" & rownum).Value = WorkBook2 .Range("B" & varPosition).Value 

     If WorkBook2 .Range("C" & rownum).Value Like "91%-100% utilization*" Then 

      WorkBook2 .Range("D" & rownum).Value = Selected 
      WorkBook2 .Range("E" & rownum).Value = For Checking 

    End If 
    End If 

End Sub 

Wie dies geschehen kann? Sobald ich meinen Code laufen lasse, funktioniert es nicht, aber ich habe keinen Fehler.

+0

Warum muss dies VBA sein? Eine Formel für die externe Arbeitsmappe (sogar geschlossen) sollte ausreichen. – Jeeped

+0

@Jeeped ich mache tatsächlich einen generierten Bericht, einer meiner Module benötigt 5 Kriterien zur Auswahl Dies ist der letzte – 7A65726F

+0

Viele der Probleme mit diesem Code treten auf, weil Sie 'Option Explicit' nicht oben eingegeben haben Dein Modul. Probieren Sie das aus, und der Code wird an verschiedenen Stellen aufgrund einer falschen Objektzuordnung fehlerhaft. Wenn Sie diese beheben und den Code erneut posten könnten, könnten wir Ihnen bei dem Rest helfen. – Ambie

Antwort

1

Sie können keine Arbeitsmappen öffnen und Arbeitsmappen-Typ-Vars Arbeitsblättern wie diesem zuweisen. Es schien mir auch, dass Ihre Logik beim Auffinden von Einrichtungsnamen, die in beiden Arbeitsblättern/Arbeitsblättern vorhanden waren, rückwärts lag. Es öffnet sich beide Arbeitsmappen, ordnet Arbeitsblatt-Typ Vars auf das erste Arbeitsblatt in jeder Arbeitsmappe und Schleifen durch die Einträge in der zweiten Arbeitsmappe dort die Anlage nutzenden Existenz in der Arbeitsmappe 1.

Public Sub Selection() 
    Dim lastRow As Long, rw As Long, rngFacility As Range, strRemark As String 
    Dim wb1 As Workbook, wb2 As Workbook 
    Dim ws1 As Worksheet, ws2 As Worksheet 

    'TextBox2 and TextBox5 need to be recognized here 
    Set wb1 = Workbooks.Open(TextBox2.Text, ReadOnly:=True) 
    Set ws1 = wb1.Worksheets(1) 
    Set wb2 = Workbooks.Open(TextBox5.Text) 
    Set ws2 = wb2.Worksheets(1) 

    lastRow = ws1.Range("A" & Rows.Count).End(xlUp).Row 
    Set rngFacility = ws1.Range("A1:A" & lastRow) 
    strRemark = "91%-100% utilization" 

    With ws2 
     lastRow = .Range("B" & Rows.Count).End(xlUp).Row 
     For rw = 2 To lastRow 
      If .Range("C" & rw) = strRemark Then 
       If Not IsError(Application.Match(.Range("B" & rw), rngFacility, 0)) Then 
        .Range("D" & rw).Resize(1, 2) = _ 
         Array("Selected", "For Checking") 
       End If 
      End If 
     Next rw 
    End With 

    'wb1.Close savechanges:=False 
    'wb2.Close savechanges:=True 

End Sub 

die Art des Benutzers gegeben, um zu bestätigen -Formular Textfelder und doppelte Arbeitsmappen, habe ich nicht von Anfang bis Ende getestet, aber es kompiliert und stellt den Prozess dar, den ich verwenden würde, um darüber zu gehen.

+0

danke ich werde versuchen, ich habe tatsächlich ein Skript, das ich als Referenz, aber einige Logik in nicht ihre, darauf verwenden Skript Die Logik lädt die Quelldatei hoch, kopiert dann Daten und erstellt ein lokales Workbook für Daten und schließt dann die Quelldatei. Was ich hier getan habe, ist die Datei hochzuladen und im hochgeladenen Update basiert es auf den Kriterien – 7A65726F

+0

Ich machte einige Fehler, wo ich wb1 und wb2 statt ws1 und ws2 verwendet. Siehe Bearbeitungen oben. – Jeeped

+0

yap, ich habe es bemerkt :) Frage 'Wenn ich nur eine Spalte brauche, wird es so sein? .Range ("D" & rw) .Resize (1) = Ausgewählt – 7A65726F

0

Ich habe gerade dieses Problem mit dem von mir bereitgestellten Code gelöst.

Public Selection() 

     Set Sheet2 = Workbooks.Open(TextBox2.Text).Sheets(1) 
     Set Sheet5 = Workbooks.Open(TextBox5.Text).Sheets(1) 

     Dim varFacility As Variant 
     Dim facilityRng As Range 

      lngLastRow = Sheet5.Range("B" & Sheet5.Rows.Count).End(xlUp).Row 
      Set facilityRng = Sheet5.Range("B1:B" & lngLastRow) 

     For rownum = 2 To Sheet2.Range("A" & Sheet2.Rows.Count).End(xlUp).Row 
      varFacility = Sheet2.Range("A" & rownum).Value 

     On Error Resume Next 
      varPosition = Application.WorksheetFunction.Match(varFacility, facilityRng, 0) 

      If Err = 0 Then 

       If Sheet5.Range("C" & varPosition).Value Like "91%-100% utilization*" Then 
        Sheet2.Range("C" & rownum).Value = "Selected" 
        Sheet2.Range("D" & rownum).Value = "For Checking" 
       End If 
      End If 
     On Error GoTo 0 

     Next 

End Sub 
Verwandte Themen