2016-06-10 7 views
1

Ich entschuldige mich für die Länge des Beitrags ... Ich wollte Ihnen so viel Detail wie möglich geben. Ich bin immer noch ein Amateur zu Access und immer noch VBA zu lernen, also sei geduldig mit mir. Der Code wird zusammen von anderen geparst, die ich an meine Bedürfnisse angepasst habe.Zugang VBA - neue Spalte mit ersten Zeile von Daten

Aufgabe durchgeführt wird:

1.) ich mit VBA mehrere Excel-Dateien aus einem Ordner in einer Access-Tabelle am importieren.

2.) Da die Dateien alle Informationen in einer Spalte enthalten, sortiere ich diese Spalte, um jedes Datenelement zu isolieren.

Ausgabe: Die erste Zeile in jeder importierten Excel-Datei hat einen Dateinamen (z. B. CA051607GA). Ich muss das als Zeile für jeden Dateiimport entfernen und möchte es zu einer neuen Spalte machen, die auf jeder Zeile wiederholt wird, die aus dieser Datei importiert wird. Es wird mir helfen, die Datei später aufzuspüren, wenn es Probleme mit diesem Datensatz gibt.


1 Beispiel Import unverändert

F1 (< -Feldes Name)

Row1: CS16052702

Row2: 00602498878941; US1A100037; US-G8; US1A100037; US -10

Reihe 3: 00602498878941; US1A100037; US-G8; US1A100037; US-10


2 Beispiel für Import Beitrag Changes (Makro):

(Feldnamen für jede Spalte, aber ich kann nicht herausfinden, wie man eine Tabelle hinzuzufügen, damit die Perioden jedes Feld zu trennen)

Row1: CS16052702

Row2: 00602498878941 .... US1A100037 .... US-G8 .... US1A100037 .... US-10

Row3: 00602498878941 ... .US1A100037 .... US-G8 .... US1A100037 .... US-10


3 Beispiel erwünschten Ausgang (Zugabe auf Makro):

Row1: CS16052702 .... 00602498878941 .... US1A100037 .... US-G8 .... US1A100037 .... US-10

Row2: CS16052702 .... 00602498878941 .... US1A100037 .. ..US-G8 .... US1A100037 ....US-10


Weitere Informationen:

Falls es wichtig ist, dass ich offensichtlich von der Natur des Makro sagen wird, werden die Dateien, wie sie in einer auf dem anderen kommen importieren. Die obigen Beispiele zeigen nur einen Dateiimport, um zwei Dateien zu demonstrieren, würden Sie einfach die 3 Zeilen unter die ursprünglichen 3 Zeilen kopieren (indem Sie die erste Zeile ändern, um sie einzigartig zu machen). Ich schließe auch das Makro ein, das ich für Ihre Referenz verwende.


Private Sub Command2_Click() 
Dim strFile As String 'Filename 
Dim strFileList() As String 'File Array 
Dim intFile As Integer 'File Number 
Dim filename As String 
Dim path As String 
DoCmd.SetWarnings False 
path = "C:\Users\BrooksJ\Desktop\Test\" 
Dim rs As DAO.Recordset ' Moved from below 

'Loop through the folder & build file list 
strFile = Dir(path & "*.xls") 
While strFile <> "" 
'add files to the list 
intFile = intFile + 1 
ReDim Preserve strFileList(1 To intFile) 
strFileList(intFile) = strFile 
strFile = Dir() 
Wend 

'see if any files were found 
If intFile = 0 Then 
MsgBox "No files found" 
Exit Sub 
End If 

'cycle through the list of files 
For intFile = 1 To UBound(strFileList) 
filename = path & strFileList(intFile) 
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel8, "Compare_Files", filename, False 
Next intFile 
DoCmd.SetWarnings True 


'change import field name 
'  CurrentDb().TableDefs("Compare_Files").Fields("F1").Name = "UPC" 
'create fields to sparse out original data field 
'  CurrentDb.Execute ("ALTER TABLE Compare_Files ADD COLUMN UPC Text;") 
'  CurrentDb.Execute ("ALTER TABLE Compare_Files ADD COLUMN SR_Profit_Center Text;") 
'  CurrentDb.Execute ("ALTER TABLE Compare_Files ADD COLUMN SR_Super_Label Text;") 
'  CurrentDb.Execute ("ALTER TABLE Compare_Files ADD COLUMN SAP_Profit_Center Text;") 
'  CurrentDb.Execute ("ALTER TABLE Compare_Files ADD COLUMN SAP_Super_Label Text;") 

'Seperate data by ";" from original file 
'  Const YOUR_TABLE_NAME As String = "Compare_Files" 
'  Const SQL_UPDATE_DATA As String = "SELECT * FROM [" & YOUR_TABLE_NAME & "] WHERE SR_Profit_Center Is Null" 
' 
'  Dim rs   As DAO.Recordset 
'  Dim strF1Data As String 
'  Dim varData  As Variant 
' 
'  Set rs = CurrentDb.OpenRecordset(SQL_UPDATE_DATA) 
'  With rs 
'   Do Until .EOF 
'    strF1Data = !UPC 
'    varData = Split(strF1Data, ";") 
'    If UBound(varData) = 4 Then 
'     .Edit 
'     !UPC = varData(0) 
'     !SR_Profit_Center = varData(1) 
'     !SR_Super_Label = varData(2) 
'     !SAP_Profit_Center = varData(3) 
'     !SAP_Super_Label = varData(4) 
'     .Update 
'    End If 
'    .MoveNext 
'   Loop 
'   .Close 
'  End With 
' 
'  Set rs = Nothing 
'====================================================================================== 
CurrentDb.Execute ("ALTER TABLE Compare_Files ADD COLUMN UPC Text, SR_Profit_Center Text, SR_Super_Label Text, SAP_Profit_Center Text, SAP_Super_Label Text;") 

CurrentDb.TableDefs("Compare_Files").Fields("F1").Name = "ref_val" 

'Dim rs As DAO.Recordset 
Dim ref_val As String 
Set rs = db.OpenRecordset("SELECT TOP 1 ref_val FROM Compare_Files;", dbOpenDynaset) 
ref_val = rs.Fields(0).Value 
rs.Close 

db.Execute "DELETE FROM [Compare_Files] WHERE ref_val = '" & ref_val & "';" 

Const YOUR_TABLE_NAME As String = "Compare_Files" 
Dim SQL_UPDATE_DATA As String 
SQL_UPDATE_DATA = "SELECT *, ';' & '" & ref_val & "' FROM [" & YOUR_TABLE_NAME & "] WHERE SR_Profit_Center Is Null" 

'Dim rs   As DAO.Recordset 
Dim strF1Data As String 
Dim varData  As Variant 

Set rs = CurrentDb.OpenRecordset(SQL_UPDATE_DATA) 
With rs 
    Do Until .EOF 
     strF1Data = !ref_val 
     varData = Split(strF1Data, ";") 
     If UBound(varData) = 4 Then 
      .Edit 
      !ref_val = ref_val 
      !UPC = varData(0) 
      !SR_Profit_Center = varData(1) 
      !SR_Super_Label = varData(2) 
      !SAP_Profit_Center = varData(3) 
      !SAP_Super_Label = varData(4) 
      .Update 
     End If 
     .MoveNext 
    Loop 
    .Close 
End With 

Set rs = Nothing 
'========================================================================================== 
End Sub 

Einige der Code wird innerhalb der Code-Boxen nicht erfassen, so habe ich versucht, den Code das Beste, was ich konnte, zu isolieren. Lassen Sie mich wissen, wenn Sie mich brauchen, um zu ändern, wie es liest, um es verständlicher zu machen.

Anmerkungen hinzugefügt: Die Dateien, die gezogen werden, variieren in der Anzahl der Zeilen.

Ich schätze jede Hilfe oder Vorschläge mit diesem Problem, das jeder geben kann. Wenn Sie weitere Informationen benötigen, lassen Sie es mich wissen. Ich habe versucht, in meiner Frage ausführlich und gründlich zu sein.

Antwort

0

Schnell und schmutzig, die folgenden Anpassungen werden Sie dahin bringen, wo Sie jetzt sein müssen.

Erstens können Sie Ihre ALTER TABLE Anweisung vereinfachen:

CurrentDb.Execute ("ALTER TABLE Compare_Files ADD COLUMN UPC Text, SR_Profit_Center Text, SR_Super_Label Text, SAP_Profit_Center Text, SAP_Super_Label Text;") 

2016-06-16 Update: korrigierte Code den richtigen Referenzwert und legen Sie sie in der Zeile für Zeile Betrieb zu erfassen.

CurrentDb.TableDefs("Compare_Files").Fields("F1").Name = "ref_val" 

Const YOUR_TABLE_NAME As String = "Compare_Files" 
Dim SQL_UPDATE_DATA As String 
SQL_UPDATE_DATA = "SELECT * FROM [" & YOUR_TABLE_NAME & "]" 

Dim rs   As DAO.Recordset 
Dim varData  As Variant 
Dim ref_val  As String 

Set rs = CurrentDb.OpenRecordset(SQL_UPDATE_DATA) 
With rs 
    Do Until .EOF 
     varData = Split(!ref_val, ";") 
     If UBound(varData) = 4 Then 
      .Edit 
      !ref_val = ref_val 
      !UPC = varData(0) 
      !SR_Profit_Center = varData(1) 
      !SR_Super_Label = varData(2) 
      !SAP_Profit_Center = varData(3) 
      !SAP_Super_Label = varData(4) 
      .Update 
     Else 
      ref_val = !ref_val 
      rs.Delete 
     End If 

     .MoveNext 
    Loop 
    .Close 
End With 

Set rs = Nothing 

Wie dbmitch heißt, es gibt viele Möglichkeiten, wie Sie diese Art von Problem umgehen kann. Wenn Sie eine Chance haben, sollten Sie Ihr Importskript so ändern, dass es jeweils eine Datei verarbeitet, und die Schleife durch die Dateien externalisieren (indem Sie die Importroutine einmal für jeden Durchlauf durch die Dateiliste aufrufen). Dies eröffnet Ihnen eine ganze Welt von Pre- und Post-Import-Optionen.

Die andere Möglichkeit, die ich sehe, wäre zu versuchen, Ihre Zeile für Zeile UPDATE mit einem Set-basierten Ansatz zu ersetzen. Dies könnte ein INSERT aus der Import-Staging-Tabelle in eine andere Tabelle sein, oder eine UPDATE, die eine SELECT verwendet, die Zeichenfolgenbearbeitungsfunktionen verwendet, um Ihre begrenzten Werte abzurufen.

+0

Danke für die Hilfe Yllzarith. Ich bekomme einen "Objekt erforderlich" -Fehler in der folgenden Zeile: 'Set rs = db.OpenRecordset (" SELECT TOP 1 Ref_Val FROM Compare_Files; ")' Ich habe die separate Datenstück auf meinem ursprünglichen Code aufgehoben Es sah so aus, als hättest du dieses Stück in dein aufgenommen. – Ragnar12

+0

Stellen Sie sicher, dass die Zeile 'Dim rs As DAO.Recordset' in Ihrem Code nach oben verschoben wurde, wie in meinem Beispiel. – Yllzarith

+0

Ich habe meinen Code im ursprünglichen Beitrag aktualisiert, um genau zu sein, was ich gerade ausgeführt habe. Ich bekomme immer noch den gleichen Fehler. – Ragnar12

0

Interessantes Problem und sieht aus wie Sie es gut dokumentiert haben. Ich würde Ihre Frage erneut bearbeiten und den oberen Code mit dem Symbol {} blockieren. Wie viele Zeilen befinden sich in den Eingabedateien? Es gibt wahrscheinlich ein paar Möglichkeiten, dies zu tun, so viel Informationen, desto besser. Persönlich würde ich eine Eingabetabelle mit den Feldern so vorberei- ten, wie sie benannt werden sollen - das Lesen aller Dateien beim Speichern der ersten Zeile in einer Variablen, das Teilen der Felder von den übrigen Zeilen und das Aktualisieren der Daten - aber es ist wahrscheinlich schneller und Es ist effizienter, in eine Vorverarbeitungstabelle zu importieren - schreiben Sie dann eine Append-Abfrage, die die Felder mit den Funktionen mid $ und instr aktualisiert. Das wäre nicht so einfach zu überprüfen, ob es eine fehlerhafte Datei gab. hmmmm. ein paar Möglichkeiten.

Wenn Sie keine Antwort gefunden haben, wenn ich nach Hause komme, werde ich sehen, ob ich eine Lösung finden kann. Die Eingabe ist jetzt schwer

+0

Die Eingabedateien können eine beliebige Anzahl von Zeilen im Bereich von 1k-2k enthalten, manchmal jedoch auch weniger.Um sicherzustellen, dass ich Ihren Vorschlag verstehe, sollten Sie eine Tabelle erstellen, deren Header bereits gefüllt sind (außerhalb des Makros). Verwenden Sie das Makro, um die Dateien in eine nicht editierte Tabelle zu ziehen, und füllen Sie dann die vorhandene Tabelle mit die Daten so wie ich es will? – Ragnar12

+0

Was ich tun würde, ist persönliche Vorliebe. Aber wenn Sie möchten, dass es Dateifehler verarbeiten kann, ist es am besten, Code zu verwenden. Ich würde definitiv die Eingabetabelle mit den korrekten Feldnamen vorgeben - besonders wenn alle Daten in eine Tabelle gehen und die Feldnamen sich nicht ändern. Für nur ein paar tausend Zeilen zu je ein paar Bytes, würde ich die ganze Datei in eine String-Variable lesen, sie auf Basis von vbCRLF aufteilen, Schleife auf jeder Zeile, Aufteilen mit ";" und dann INSERT mit Batch-Transaktionen alle 100 oder so Zeilen – dbmitch

+0

Ich bin mir nicht sicher, ob ich die INSERT mit Batch-Transaktionen alle 100 oder so Linien Stück verstehe. Wie würde das funktionieren? Würde dies dazu führen, dass der Chargenname nicht in jeder Zeile angezeigt wird? – Ragnar12

Verwandte Themen