VBA Entwickler-Treff

VBA Entwickler-TreffVBA Entwickler-Treff

1516 members | 784 posts | Public Group
Bernd Held
Hosted by:Bernd Held

Ein Kunde hatte den Wunsch, in seiner Access-Anwendung Aufkleber mit QR-Codes ausdrucken und wieder einlesen zu können, um das fehleranfällige manuelle Beschriften und spätere Eingeben zu vermeiden. Nachdem in der c't und bei der AEK die Freeware SimpleCodeGenerator (https://www.nirsoft.net/utils/qr_code_generator.html) von NirSoft empfohlen wurde, habe ich diese getestet, für gut befunden und mir eine kleine Klasse geschrieben, um sie leicht in jede Anwendung einbinden zu können.

Meine Testanwendung, in der man auch gleich die erzeugten QR-Codes anzeigen, vom Bildschirm abscannen und prüfen lassen kann, stelle ich Euch gerne zur Verfügung. Dabei ist der (für die spätere Verwendung überflüssige) Testteil mal wieder größer ausgefallen als die eigentliche Funktionalität 😉.

Ihr könnt die Klasse selbstverständlich auch (mit ein paar kleinen Anpassungen) in Excel oder Word eingesetzt werden, um dort individuelle QR-Codes zu erzeugen.

Nach der Konfiguration des Barcodescanners (die QR-Codes mussten erst freigeschaltet werden) funktioniert das Einlesen der Aufkleber und die weitere Verarbeitung der enthaltenen Daten in Access problemlos.

Hier gibt’s die Klasse und meine Testanwendung: https://www.datenbankmanufaktur.de/acQR-Code.htm

Herzliche Grüße

Raphael

Moin Raphael, werd ich mal testen, denn das QR Gedöns kommt immer öfter in Anfragen. Leider funzt der Download (bei mir) nicht Gruß klaus
Sehr interessant! Vielen Dank dafür!

Hallo zusammen,

aus meinem gestrigen Rundschreiben möchte ich Euch eine Erweiterung des Datenfilters von Excel zeigen.

Dabei werden die gewünschten zu filternden Daten in der Tabelle markiert und über eine Tastenkombination automatisch eingestellt.

Es muss also nicht mehr Kriterium für Kriterium im Datenfilter mühselig angeklickt werden, sondern das Ganze funktioniert jetzt auf Knopfdruck.

Sub ZellenAlsFilterkriterienEinstellen()

Dim rngZelle As Range, lngSpalte As Long

Dim VarDat As Variant

Dim lngZ As Long

ReDim VarDat(0)

lngSpalte = Selection.Column

For Each rngZelle In Selection

VarDat(lngZ) = rngZelle.Value

ReDim Preserve VarDat(UBound(VarDat) + 1)

lngZ = lngZ + 1

Next rngZelle

ReDim Preserve VarDat(UBound(VarDat) - 1)

ActiveSheet.Range("A:C").AutoFilter Field:=lngSpalte, _

Criteria1:=VarDat, Operator:=xlFilterValues

End Sub

**** Quelle: VBA-Tanker, ID: 12942

Um alle vorher markierten Zellen dem Datenfilter zuordnen zu können, benötigen wir ein Datenfeld, das zunächst angelegt wird

und in der Größe 1 (1 Feld) redimensioniert wird. Hierzu wird die Anweisung ReDim verwendet.

Da Arrays standardmäßig Nullbasiert sind, bedeutet der Befehl ReDim VarDat(0), dass ein Array mit einem Feld im

Arbeitsspeicher angelegt wird. Danach werden alle vorher markierten Zellen über eine For each Next – Schleife nacheinander

verarbeitet. Innerhalb der Schleife wird der jeweilige Zelleninhalt in den Array geschrieben. Danach wird der eindimensionale

Array mit Hilfe der Anweisung ReDim Preserve um ein weiteres Feld erweitert. Im Lokal-Fenster der Entwicklungsumgebung kann man

das Anwachsen des Datenfelds super beobachten, wenn man mit F8 Schritt für Schritt das Makro abarbeitet. Wurden alle markieren

Einträge verarbeitet und danach die Schleife verlassen, ist das Datenfeld genau ein Feld zu groß. Daher wird das Datenfeld mit

dem Befehl ReDim Preserve VarDat(UBound(VarDat) - 1) das Datenfeld um ein Feld verkleinert. Jetzt kann das Datenfeld direkt an

den Datenfilter übergeben werden. Über den Einsatz der Methode AutoFilter wird der Datenfilter gesetzt. Im Parameter Field wird

die Spaltennummer angeben, die gefiltert werden soll. Dabei bezieht sich die Nummer auf den Bereich, der links vor dem

AutoFilter-Befehl angegeben ist. Im Parameter Criteria1 wird dann das Datenfeld übergeben. Wichtig in diesem Zusammenhang ist

auch der letzte Parameter Operator. Geben Sie hier die Konstante xlFilterValues an.

Was jetzt noch fehlt, das wäre eine geeignete Tastenkombination, um die Filterung anzuwenden.

Dazu wird beim Öffnen der Arbeitsmappe die Tastenkombination Strg + ü eingestellt.

Private Sub Workbook_Open()

'Tastenkombination: Strg+ü

Application.OnKey "^ü", "ZellenAlsFilterkriterienEinstellen"

End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)

'Tastenkombination beim Schließen der Mappe wieder aufheben

Application.OnKey "^ü"

End Sub

Das Ereignis Workbook_Open wird automatisch beim Öffnen der Mappe ausgeführt. Über die Methode OnKey wird dabei die Tastenkombination

Strg + ü mit dem Makro ZellenAlsFilterkriteriumEinstellen verknüpft. Achten Sie darauf, dass Sie diese Tastenkombination beim Schließen

der Mappe wieder zurücksetzen. Dies geschieht im Ereignis Workbook_BeforeClose.

Das Video zu diesem Beispiel findet ihr hier:

https://www.youtube.com/watch?v=rf-hPB6q6UA

VG

Bernd

This post is only visible to logged-in members. Log in now
Hi Robert, ich hab da mal ein Excel Tool gehabt, in welchem man die Entfernung durch eingabe der Adressen ermitteln kann. Vielleicht ist das ein Ansatz Sende das mal an Deine Mailadresse Gruß Klaus PS.: evtl. musst Du den "Maps Link" im Skript anpassen
This post is only visible to logged-in members. Log in now

Hallo zusammen,

habe da nen Problem(chen)

Folgendes Problem

Ich füge eine Exceltabelle in in ein Wordfile (Textmarke) ein.

Das funktioniert soweit gut mit

Activesheet.Range("A11:E15").Copy

WWDoc.Bookmarks("Tabelle").range.paste )

nun möchte ich aber das die ganze Tabelle im Wordfile rechtsbündig erscheint.

Alles was ich bisher gefunden habe bezieht sich auf die eintzelnen Felder, Zeilen Spalten innerhalb der tabelle

Hat jemand ne Idee oder nen Tipp ?

Vielen dank

Klaus

In Word selbst wäre es etwas wie: Selection.Tables(1).Rows.Alignment = wdAlignRowRight
Hi Peter, Danke für Deinen Tipp, ABER Bekomme die Fehlermeldung, dass die Variable wdAlignRowRight nicht deklariert sei. habe Word mit LateBinding eingebunden. Irgendwas mach ich da falsch Hier mal den Skriptteil ------ Set WWApp = CreateObject("Word.Application") Set WWDoc = WWApp.documents.Add(template:=WWTemplate) WWApp.Visible = True WWApp.Activate '---Wordfile Kopfdaten---------------------------------- WWDoc.bookmarks("kundenname").Range.Text = KDName & vbLf WWDoc.bookmarks("ProjektNummer").Range.Text = PRoNr With Sheets("LI-Tab") LIRow = .Cells(500, 2).End(xlUp).Row .Range("A11:E" & LIRow).Copy End With WWDoc.bookmarks("ÜTab").Range.Paste With WWDoc.tables(1) .Columns.AutoFit .Columns.AutoFit .applystylerowbands = False .Rows.Alignment = wdAlignRowRight End With ------- Gruß Klaus

Hallo zusammen,

hab da ein Problem(chen) und hoffe auf eure Hilfe.

Also:

Ich habe eine Excel Tabelle, bei der am Ende noch ein Textbock von ca. 12 Zeilen angehängt wir.

Mein Problem: Wie bekomme ich es hin, dass wenn ein Seitenumbruch genau in diesem Block liegt, dieser Seitenumbruch "nach oben" verschoben wird, so dass der Textblock dann auf einer neue Seite liegt ?

Hat jemand ne Idee ???

Danke schon mal für eure Tipps

Gruß

Klaus

Hallo Klaus, ich habe mir in der Vergangenheit immer damit beholfen, die Zeichen in solche einem Textfeld zu zählen. Und wenn die einen gewissen Schwellenwert überschreiten, dann haben ich per Skriptzeile den PageBrake verschoben. Was "eleganteres" ist mir bis heute noch nicht untergekommen, bin da aber sehr empfänglich für neue Ideen an der Stelle. ;-) Gruß Ronny
Hi Ronny, danke für Deinen Tipp, aber Da mal nur 3 zeilen" auf die neue Seite gehen, ein anderes Mal 7 Zeilen komme ich nicht richtig weiter. Meine Idee war schon mal : 1. herausfinden an welcher Zeile der Umbruch stattfindet 2. wenn dieser innerhalb der letzten 12 Zeilen befindet, dann einen manuellen umbruch setzen Krieg das aber nicht hin :-( Gruß Klaus