2016-08-05 38 views
-1

der Code unten kopiert "ADXL364" Blatt in meinem aktiven Arbeitsblatt, aber ist so, dass ich das Blatt kopieren kann, wenn es "XL364" oder "364"Verweis auf eine Zelle, wenn das Blatt eine bestimmte Zeichenfolge enthält VBA

enthält

wenn ich Sternchen 'C: \ Daten [Adxl364.xls] * ADXL364_QC'! A1 in meinem Code setzt es nicht funktioniert.

Sub GetRange() 
    With Range("A:Z") 
     .Formula = "=If('C:\data\[adxl364.xls]ADXL364_QC'!A1 > 0,'C:\data\[adxl364.xls]ADXL364_QC'!A1,Text(,))" 
     .Formula = .Value 
    End With 
    End Sub 

der lange Code wird die Lage der Datei vom Benutzer bekommt dann ein Arbeitsblatt kopieren, die ADXL364 oder XL364 enthält

With ActiveWorkbook 
    Sheets.Add.Name = "Flow_table" 
    Application.EnableEvents = False 

    TP_location = Left(TextBox1.Value, InStrRev(TextBox1.Value, "\")) 
    TP_filename = Right(TextBox1.Value, Len(TextBox1.Value) - InStrRev(TextBox1.Value, "\")) 
    TP_filename = "[" & TP_filename & "]" 
    TP_formula = "'" & TP_location & TP_filename & TextBox2.Value & "'!A1" 

    getcellvalue = "=if(" & TP_formula & ">0," & TP_formula & "," & """"")" 

     With Range("A:Z") 
     .Formula = getcellvalue 
     .Formula = .Value 
     End With 

    Sheets.Add.Name = "Job_lists" 

End With 
Unload UserForm2 
End Sub 
+0

Wo wird kopiert? –

+0

mit Zelle A1 ist die in diese Zelle geschriebene Formel = If ('C: \ Daten \ [Adxl364.xls] ADXL364_QC'! A1> 0, 'C: \ Daten \ [Adxl364.xls] ADXL364_QC'! A1, " "). Die Schleife passiert von A bis Z. So referenziert vielleicht der richtige Begriff eine Zelle aus einer geschlossenen Arbeitsmappe –

+0

Sie können versuchen, die Pfadposition zu bearbeiten und ein Blatt auszuwählen, das Sie "referenzieren" und das Modul in ein neues Arbeitsblatt einfügen möchten. Sie erhalten eine Kopie des Referenzbogens. In diesem Fall ADXL364 Blatt, Bereich A bis Z –

Antwort

0

Ein hässlicher, aber möglicher Weg wäre eine Brute-Force-Fehler-Trapping-Technik.

Eine elegantere Lösung könnte jedoch die Verwendung von ADO sein. Sie könnten zum Beispiel zwei "Abfragen" ausführen: die erste im Tabellenschema, die Ihnen Ihre Blattnamen in der angegebenen Datei geben würde, und die zweite auf dem gefundenen Blattnamen. Dies würde ein RecordSet produzieren, das die Daten Ihres geschlossenen Blattes enthält, welches direkt unter Verwendung der .CopyFromRecordset Methode in eine Range geschrieben werden kann. Natürlich könnten Sie einfach die erste Abfrage ausführen, um den Namen Ihres Arbeitsblatts zu suchen und weiterzumachen, wie Sie es in Ihrem veröffentlichten Code getan haben.

Das folgende Beispiel zeigt den Code für die zwei Abfragen. Es ist alles spät gebunden, also müssen Sie nicht auf die ADO-Bibliothek verweisen, aber ich überlasse diese Entscheidung Ihnen. Ich habe ein paar Konstanten an der Spitze des Moduls, die möglicherweise abhängig von Ihrer Version von Excel ändern müssen. Sie müssen auch Ihre eigene Fehlerbehandlung schreiben (vor allem, um die Verbindung zu schließen), aber ich werde diese für Sie auch wieder verlassen.

Option Explicit 
Private Const SCHEMA_TABLES As Integer = 20 
Private Const OPEN_FORWARD_ONLY As Integer = 0 
Private Const LOCK_READ_ONLY As Integer = 1 
Private Const CMD_TEXT As Long = 1 
Private Const PROVIDER As String = "Microsoft.ACE.OLEDB.12.0" 
Private Const XL_PROP As String = """Excel 12.0;HDR=No""" 
Private Const SHEETS_FIELD_NAME As String = "TABLE_NAME" 

Public Sub AcquireData() 
    Dim fPath As String 
    Dim fName As String 
    Dim key As String 
    Dim addr As String 
    Dim oConn As Object 
    Dim oRS As Object 
    Dim connString As String 
    Dim sql As String 
    Dim found As Boolean 
    Dim sheetField As String 

    'Define the path and file name 
    fPath = "C:\Users\User\Documents\StackOverflow" 
    fName = "closed_book.xlsx" 

    'Define the search key 
    key = "XL364" 

    'Define the address of closed worksheet 
    'If reading one cell then use [address:address], eg "A1:A1" 
    addr = "A1:E5" 

    'Late bind the ADO objects 
    Set oConn = CreateObject("ADODB.Connection") 
    Set oRS = CreateObject("ADODB.Recordset") 

    'Open conection 
    connString = "Provider=" & PROVIDER & ";" & _ 
       "Data Source=" & fPath & "\" & fName & ";" & _ 
       "Extended Properties=" & XL_PROP & ";" 

    oConn.Open connString 

    'Search for the sheet name containing your key 
    'in the tables (ie sheets) schema 
    found = False 
    oRS.Open oConn.OpenSchema(SCHEMA_TABLES) 
    Do While Not oRS.EOF 
     sheetField = oRS.Fields(SHEETS_FIELD_NAME).Value 
     If InStr(sheetField, key) > 0 Then 
      found = True 
      Exit Do 
     End If 
     oRS.MoveNext 
    Loop 
    oRS.Close 

    'Read the target data 
    If found Then 
     sql = "SELECT * FROM [" & _ 
       sheetField & addr & "];" 

     oRS.Open sql, oConn, OPEN_FORWARD_ONLY, LOCK_READ_ONLY, CMD_TEXT 

     'Write the data to your worksheet 
     If Not oRS.EOF Then 
      ThisWorkbook.Worksheets("Sheet1").Range("A1") _ 
       .CopyFromRecordset oRS 
     End If 

    End If 


    'Housekeeping 
    oRS.Close 
    Set oRS = Nothing 
    oConn.Close 
    Set oConn = Nothing 

End Sub 
+0

Das ist cool. :) ich danke dir sehr. –

0

Sie testen können, ob der Text „XL364“ ist im Blattnamen, indem Sie jedes Blatt durchlaufen und die Funktion InStr (in Zeichenkette) verwenden. Beispiel:

For Each ws in Workbooks.Open(filepathStringFromUserInput) 
    If InStr(1, ws.Name, "XL364") > 0 Then 
     MsgBox "hi" 
     'Set hwSheet = ws 
    End If 
Next ws 


With hwSheet 
    'do some code eg: 
    .Range("A1").Value = "Hi" 
End With 
+0

Hallo @Oliver Carr, ADXL364.xls ist eine geschlossene Arbeitsmappe. Also ich denke der Code wird nicht funktionieren. –

+0

@J_Gonzales Ich glaube nicht, dass es eine Möglichkeit gibt, ein Blatt so zu referenzieren, wie Sie es wünschen. Versuchen Sie meine bearbeitete Antwort, um die angegebene Datei zu öffnen und durch die Blätter zu suchen. – Carrosive