2.5k Aufrufe
Gefragt in Tabellenkalkulation von
Hallo Zusammen.
Bestimmt kann mir einer von den VBA-Profis hier im Forum helfen :-)

Ich habe die Anforderung, dass mehrere Excel Dateien aus einem bestimmten Ordner nacheinander geöffnet werden sollen, dann soll ein vorhandenes Makro pro Datei abgearbeitet werden (es wird hier ein QR Code generiert und eingefügt) und anschl. soll die Datei in einem anderen Ordner wieder gespeichert werden.
Kann man das überhaupt mit VBA machen? Ist das Sinnvoll, oder schlagt Ihr was Anderes vor?
Wäre toll, wenn wir das hinkriegen würden. Vielen Dank schon mal.

Viele Grüße
QRMan

8 Antworten

0 Punkte
Beantwortet von m-o Profi (22.9k Punkte)
Hallo,

du kannst mit einem Makro problemlos Excel-Dateien öffnen, diese bearbeiten und wieder in einem anderen Ordner speichern.
Es ist eigenlich nur die Frage, ob die Dateinamen feststehen (also immer die selben sind) oder ob du die Dateien über den Öffnen-Dialog auswählen willst oder ob alle Excel-Dateien in einem bestimmten Verzeichnis geöffnet werden sollen. Um dir zu helfen, wäre auch die Angabe der Pfade für das Öffnen und Speichern hilfreich.
Und wenn sowieso schon ein Excel-Makro für den QR-Code existiert, kann man das problemlos einbinden.

Gruß

M.O.
0 Punkte
Beantwortet von
Hallo M.O.

vielen Dank für die schnelle Antwort. Die Dateinamen sind immer unterschiedlich. Das Verzeichnis, aus dem die Dateien geöffnet werden sollen, sowie das Verzeichnis in das die Daten geschrieben werden sollen steht noch nicht fest. Als dummy könnte c:\rein und c:\raus dienen.
Es sollen immer alle dateien in diesem Verzeichnis geöffnet werden. Das Verzeichnis dient nur dieser Stapelverarbeitung.

Das Makro für den QR Code habe ich hier mal angefügt (natürlich habe ich das nicht selber geschrieben :-) Es ist von StrokeScribe und dort auf der Internetseite frei zugänglich [www.strokescribe.com] )

Sub BulkQR()
Dim wsh As Worksheet
Set wsh = Application.ActiveSheet 'QR codes are generated on the active worksheet

Dim shp As Shape
For Each shp In wsh.Shapes 'Deletes all barcode pictures which are generated previously
If shp.Type = msoPicture And InStr(shp.Name, "BarcodePicture") > 0 Then
shp.Delete
End If
Next

Dim ss As StrokeScribeClass 'Invisible COM server
Set ss = CreateObject("STROKESCRIBE.StrokeScribeClass.1")
ss.Alphabet = QRCODE

pict_path = Environ("TEMP") + "\bar.wmf" 'A temporary file for pictures

Row = 1
Do
Dim data As String
data = wsh.Cells(Row, 2) 'Data for barcodes is taken from the first column

If Len(data) = 0 Then Exit Do 'The code will stop execution on first empty cell occurrence

ss.Text = data
rc = ss.SavePicture(pict_path, WMF, 1440, 1440) 'A 1x1 inch QR Code is stored in a temporary file. 1440 TWIPs=1in.
If rc > 0 Then 'Reports the error if SavePicture() call was unsuccessful
MsgBox ss.ErrorDescription
Exit Do
End If

Set qrcode_cell = wsh.Cells(1, 7) 'The cell where the QR Code will be placed

'The rectangle which fits into the cell. QR codes are square in shape.
qrcode_size = Application.Max(qrcode_cell.Width, qrcode_cell.Height)

'Barcode picture is loaded from file and centered in the cell:
Set shp = wsh.Shapes.AddPicture(pict_path, msoFalse, msoTrue, _
qrcode_cell.Left + (qrcode_cell.Width - qrcode_size) / 2, _
qrcode_cell.Top + (qrcode_cell.Height - qrcode_size) / 4, _
qrcode_size, qrcode_size)

'Each picture is named as BarcodePictureN, where N is 1,2,3...
'So the pictures can be easily removed next time
shp.Name = "BarcodePicture" & Format(Row)

Row = Row + 1 'Going to the next worksheet row
Loop

Kill pict_path 'We don't need the temporary picture file any more

Set ss = Nothing 'Deletes the barcode COM object
End Sub

Beste Grüße
QRMan
0 Punkte
Beantwortet von m-o Profi (22.9k Punkte)
Hallo,,

probier mal das folgende Makro aus:

Sub dateien_oeffnen()

Dim strInput As String
Dim strOutput As String
Dim strDatei As String

With Application
.ScreenUpdating = False 'Bildschirmaktualisierung ausschalten
.DisplayAlerts = False 'Nachfragen ausschalten - ggf. vorhandene Dateien werden überschrieben
End With

'Ein- und Ausgabepfad wird festgelegt
strInput = "C:\Input\"
strOutput = "C:\Output\"

'nur Excel-Dateien öffnen
strDatei = Dir(strInput & "*.xlsx")

'Schleife zum Öffnen der Dateien
Do While strDatei <> ""
'Datei nur öffnen, wenn nicht mit dem Namen des Worksbooks identisch, in dem das Makro ist
If ThisWorkbook.Name <> DateiName Then
'Datei öffnen
Workbooks.Open Filename:=strInput & strDatei
'1. Blatt in Arbeitsmappe auswählen
Workbooks(strDatei).Worksheets(1).Activate
'nun das QR-Makro aufrufen
Call BulkQR
'bearbeitete Datei speichern und schließen
With Workbooks(strDatei)
.SaveAs Filename:=strOutput & strDatei
.Close SaveChanges:=True
End With
End If
strDatei = Dir
Loop

With Application
.ScreenUpdating = True 'Bildschirmaktualisierung einschalten
.DisplayAlerts = True 'Nachfragen einschalten
End With

End Sub


Beim Öffnen der Excel-Datei wird immer das erste Blatt aufgerufen, dort wird dann auch der QR-Code einfgefügt. Eventuell im Ausgabeverzeichnis vorhandene Dateien werden ohne Nachfrage überschrieben.

Gruß

M.O.
0 Punkte
Beantwortet von
Hallo M.O.

erst mal ein Frohes Neus Jahr!
vielen Dank für das Makro. Leider kenne ich mich in Bezug auf Makros überhaupt nicht aus :-(
Wie bekomme ich denn beide Makros zum gemeinsamen laufen? Wie muss ich das abspeichern, damit Dein Makro auch das QR Makro "findet". Müssen beide über ein *.xlsx abgespeicichert werden? Das hat bei mir irgendwie nicht geklappt :-(

Beste Grüße
QRMan
0 Punkte
Beantwortet von m-o Profi (22.9k Punkte)
Hallo QRMan,

auch dir erst einmal ein frohes neues Jahr.
Am einfachsten kopierst du mein gepostetes Makro in die Datei, in der auch dein Makro für den QR-Code steht.
Beide Makros gehören in ein Standard Modul der Datei.
Die Datei musst du als .xlsm (Datei mit Makros) speichern. Mein gepostetes Makro ruft das QR-Makro auf (Zeile: Call BulkQR).

Gruß

M.O.
0 Punkte
Beantwortet von
Hallo M.O.

super. Klasse! Das hat alles super funktioniert! Vielen Dank!

Vielleicht könntest Du mir noch bei einer weitern Sache helfen? Bei dem QR-Makro wird die Größe und Position des QR Code festgelegt:

'The rectangle which fits into the cell. QR codes are square in shape.
qrcode_size = Application.Max(qrcode_cell.Width, qrcode_cell.Height)

'Barcode picture is loaded from file and centered in the cell:
Set shp = wsh.Shapes.AddPicture(pict_path, msoFalse, msoTrue, _
qrcode_cell.Left + (qrcode_cell.Width - qrcode_size) / 2, _
qrcode_cell.Top + (qrcode_cell.Height - qrcode_size) / 4, _
qrcode_size, qrcode_size)

Durch probieren habe ich herausgefunden, dass Application.Max das Bild zu groß macht, aber Application.Min macht das Bild zu klein. Wie kann ich die Größe variabel verändern?
Derzeit habe ich mir mit der Feldgröße beholfen (habe einfach das Feld größer gemacht und Application.Min gesetzt). Das ist aber nicht so elegant. Lieber würde ich die Bildgröße direkt verändern.


Vielen Dank und viele Grüße
QRMan
0 Punkte
Beantwortet von m-o Profi (22.9k Punkte)
Hallo,

der QR-Code wird als Bild eingefügt. Verantwortlich ist diese Zeile, in der auch die Größe festgelegt wird:
Set shp = wsh.Shapes.AddPicture(pict_path, msoFalse, msoTrue, _
qrcode_cell.Left + (qrcode_cell.Width - qrcode_size) / 2, _
qrcode_cell.Top + (qrcode_cell.Height - qrcode_size) / 4, _
qrcode_size, qrcode_size)

Wobei die Paramater wie folgt sind:
Ausdruck.AddPicture(Filename, LinkToFile, SaveWithDocument, Left, Top, Width, Height)

Wenn du die Größe ändern willst, dann musst du mit Width und Height experimentieren, und qrcode_size durch Zahlen ersetzen. Dabei gilt 1 cm = 28,35 pt
Set shp = wsh.Shapes.AddPicture(pict_path, msoFalse, msoTrue, _
qrcode_cell.Left + (qrcode_cell.Width - qrcode_size) / 2, _
qrcode_cell.Top + (qrcode_cell.Height - qrcode_size) / 4, _
76,05, 76,05)

Damit wäre der QR-Code also 3 cm x 3 cm groß.

Gruß

M.O.
0 Punkte
Beantwortet von m-o Profi (22.9k Punkte)
Hallo,

nochmal ich ;-)
Damit wäre der QR-Code also 3 cm x 3 cm groß.

Das ist natürlich Blödsinn. Die Größe beträgt ca. 2,7 cm x 2,7 cm!

Gruß

M.O.
...