Category Archives: Excel-Objekte

Keinen Humor haben, aber sich einen Account bei facebook zulegen. Man geht doch auch nicht zu Ikea, wenn man keine Teelichter braucht.

Boah ist das widerlich!!! *)

Ich erstelle ein Exceltabellenblatt, bei dem der Anwender zwischen zwei Texten wechseln kann. Je nach Text wird eine andere Liste für die Datenüberprüfung verwendet. Da die Liste dynamisch ist und aus einem anderen System kommt, muss ich ein paar Zeilen VBA-Code verwenden:

If Target.Value = „Für Standorte“ Or Target.Value = „Für Gebäude“ Then […]

Nach einer Weile meldet sich der Anwender und sagt, dass er auf diesem Tabellenblatt eine Fehlermeldung erhält. Ich schaue nach:

Das Gemeine: Der Anwender hat einen Doppelklick auf eine verbundene Zelle ausgeführt. Dadurch greift das Target-Objekt nicht – es nicht nun nicht mehr EINE Zelle, die einen Inhalt hat, sondern ein Zellbereich. Ich erhalte einen Fehler!

Also noch schnell eine Zeile Code außenrum – in der ersten Spalte wurde nichts verbunden.
If Target.Column = 1 Then
Und schon klappt es!

Haben Pferde Vorurteile? Denkt zum Beispiel ein Galopppferd von einem Dressurpferd ‚diese Tunte‘?

Hallo Herr Martin,

dieses Mal ist mir ein etwas seltsames Verhalten von VBA aufgefallen, wahrscheinlich kennen Sie das, mir ist es eben zum ersten Mal begegnet.

Ich habe in diesem Beispiel eine sehr simple Schleife mit der Vlookup-Funktion.

In „Sheets(„Tabelle2“).Range(„A:B“)“ stehen die Daten, die ich in „Sheets(„Tabelle1“).Cells(i, 2) hineinspielen möchte.

Ich weiß, ist nicht elegant, aber mir geht es um die Funktion an sich.

Sub Test()

Dim i As Integer

For i = 2 To 11

If Not IsError(Application.WorksheetFunction.VLookup(Cells(i, 1).Value, Sheets(„Tabelle2“).Range(„A:B“), 2, False)) Then

Sheets(„Tabelle1“).Cells(i, 2).Value = Application.WorksheetFunction.VLookup(Cells(i, 1).Value, Sheets(„Tabelle2“).Range(„A:B“), 2, False)

Else:

Sheets(„Tabelle1“).Cells(i, 2).Value = „Fehler“

End If

Next i

End Sub

Verwende ich für Vlookup die Schreibweise Application.WorksheetFunction.VLookup, dann bleibt die Schleife beim ersten Wert hängen, den er nicht findet und gibt den Laufzeitfehler 1004 aus (Die Vlookup-Eigenschaft des WorksheetFunction-Objektes kann nicht zugeordnet werden). Der Versuch, mit „If not isError“ den Fehler abzufangen, schlägt fehl.

Verwende ich jedoch die Schreibweise Application.VLookup, dann funktioniert alles perfekt und in „Sheets(„Tabelle1“).Cells(i, 2).Value“ wird „Fehler“ hineingeschrieben.

Ein identisches Verhalten zeigen auch andere Funktionen, wie Application.WorksheetFunction.Match.

Verstehen Sie das?

Danke Ihnen und viele Grüße,

Hallo Herr D.

Der Code sieht korrekt aus. Ich kann dazu nur Folgendes sagen:

Letzte Woche habe ich ein VBA-Add-In für einen Kunden erweitert – ich wollte Daten per Formeln aufbereiten, um darauf ein Diagramm aufzusetzen.

Die Formel sah so aus:

xlBlattDiagramm.Range(„B“ & intZeilenDiagramm + 3).Offset(intZeilenDiagramm – 2)).FormulaR1C1 = _

        „=OFFSET(R1C1,0,“ & (intBereichsSpalten + 1) & „-COUNTIF(R[-“ & (intZeilenDiagramm + 1) & „]C:R[-“ & (intZeilenDiagramm + 1) & „]C[“ & (intBereichsSpalten – 1) & „],MAX(R[-“ & (intZeilenDiagramm + 1) & „]C:R[-“ & (intZeilenDiagramm + 1) & „]C[“ & (intBereichsSpalten – 1) & „])))“

    ‚ — =BEREICH.VERSCHIEBEN($A$1;0;9-ZÄHLENWENN(B2:I2;MAX(B2:I2)))

Bei mir lief es hervorragen – der Kunde erhielt auf mehreren Rechnern eine Fehlermeldung – Laufzeitfehler 1004.

Deutlich: ich habe keine Ahnung warum!

Statt einer programmierten Formel habe ich dann die Daten mit einer Schleife aufbereitet – das geht immer …

Heißt: sorry, ich weiß den Grund nicht!

Manchmal nervt es mich, dass ich auf mein gutes Aussehen, meine hohe Intelligenz und mein vieles Geld reduziert werde. Ich bin auch gut im Bett!

PlotArea – der Zeichnungsbereich eines Diagramms. Die Aufgabe: aus generierten Daten soll ein XY-Diagramm erzeugt werden. Nichts leichter als das:

' -- das Diagramm
     Set xlChart = xlBlattDiagramm.ChartObjects.Add(500, 100, 800, 400)
     Set xlDiagramm = xlChart.Chart
' -- XY-Diagramm
xlDiagramm.ChartType = xlXYScatter

With xlDiagramm
    .SetSourceData Source:=xlBlattDiagramm.Range(xlBlattDiagramm.Range("B" & (intZeilenDiagramm + 2)), _
        xlBlattDiagramm.Range("C" & intBereichsZeilen))  '   Range("'fin. Impact'!$B$8:$C$17") - Datenquelle

    .SetElement msoElementDataLabelLeft ' -- Datenbeschriftung
    .SetElement msoElementLegendNone ' -- keine Legende

    .FullSeriesCollection(1).DataLabels.Format.TextFrame2.TextRange. _
        InsertChartField msoChartFieldRange, "='" & strKategorie & "'!$A$" & (intZeilenDiagramm + 2) & ":$A$" & intBereichsZeilen & "", 0
    ' -- Beschriftung der Datenpunkte

    .FullSeriesCollection(1).DataLabels.ShowValue = False
    .FullSeriesCollection(1).DataLabels.ShowRange = True ' -- Werte anzeigen

    .Axes(xlValue).TickLabelPosition = xlNone
    ' -- y-Achse ausblenden

Das Ergebnis:

Nun möchte ich noch die Zeichnungsfläche verschieben, damit man die Beschriftung der Y-Achse besser sehen kann. Obwohl sie einen Abstand von Links = 7 hat, darf ich diesen Wert nicht auf 100 setzen?!?

Nach vielem Probieren finde ich die Lösung:

.PlotArea.Width = .PlotArea.Width * 0.9
.PlotArea.Left = .PlotArea.Left + 100

Das klappt!

Ich verstehe es nicht.

Wer nur die Hälfte weiß, spart 50 Prozent.

Und schon wieder bin ich reingefallen. Ich möchte in einem Excel-Formular per VBA eine Datenübrprüfung einfügen. Referenzspalte ist Spalte A. Steht dort kein Wert wird eine Datenüberprüfung generiert:

For j = 11 To ThisWorkbook.Worksheets(i).Range(„A1“).SpecialCells(xlCellTypeLastCell).Row
If ThisWorkbook.Worksheets(i).Range(„A“ & j).Value = „“ Then
‚ — Datenüberprüfung
End If
Next

Und natürlich erhalte ich einen Fehler: G36 ist „leer“ (weil verbunden mit G35), aber in G36 kann man keine Datenüberprüfung einschalten ( weil verbunden mit G35). Die Lösung: RAUS MIT DEN VERBUNDENEN ZELLEN:

Dann klappt es hervorragend.

Gym? Ich dachte du meintest Gin!

Ich habe den Fehler nicht einkreisen können. Aber er ist da:

In einem Excelformular werden Daten eingegeben. Dort werden Datenüberprüfungen verwendet, die Daten aus einem anderen Tabellenblatt holen. Die Liste verwendet einen Bezug auf das Blatt =tbl_Basisdaten!…

Ich kopiere über eine Schaltfläche ein Tabellenblatt „Interview BIA“ von einer anderen Datei in die aktuelle Datei.

Dadurch wird der Bezug auf die alte Datei hergestellt =[Alte Datei.xlsm]tbl_Basisdaten!…

Das ist mir leider nicht aufgefallen, weil die Dateien auf meiner Festplatte liegen und es deshalb zu keiner Fehlermeldung kommt.

Das muss raus! Okay – wir ändern das:

Ich generiere die Datenüberprüfungen aufgrund der Basisdaten auf dem Interviewformular. Ich verwende keinen Bezug, schreibe per Programmierung „Auftragsabwicklung;Arbeitsvorbereitung und Einkauf;Produktrealisierung Individual;Produktrealisierung maschinelle Fertigung;Wartung / Instandhaltung;Lager / Logistik;EDV-Systembetreuung:

    For i = 2 To intZeilen
        strZellinhalt = ThisWorkbook.Worksheets(Blatt).Range(strSpalte & i).Value
        strListeDatenüberprüfung = strListeDatenüberprüfung & "," & strZellinhalt
    Next
    If strListeDatenüberprüfung Like "*,*" Then
        strListeDatenüberprüfung = VBA.Mid(strListeDatenüberprüfung, 2)
    End If
    If strListeDatenüberprüfung <> "" Then
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Formula1:=strListeDatenüberprüfung   ' -- geändert, weil Interviewblatt nun importiert wird
        .IgnoreBlank = True
        .InCellDropdown = True
        .InputTitle = ""
        .ErrorTitle = ""
        .InputMessage = ""
        .ErrorMessage = ""
        .ShowInput = True
        .ShowError = True
    End If

Das Ergebnis:

Klappt:

Ich speichere die Datei, schließe sie und öffne sie:

„Wir haben ein Problem bei einigen Inhalten erkannt. Sollen wir so viel wie möglich wiederherstellen? Wenn Sie der Quelle dieser Arbeitsmappe vertrauen, klicken Sie auf ‚Ja‘.“ Die Datei ist kaputt! Ich finde den Fehler nicht!

Böses, böses Excel!

Das ist kein Speck! Das ist erotische Nutzfläche!

Ich erstelle ein Add-In für einen Kunden. Mit Makros und mit Symbolen im Menüband. Ein Teil des XML-Codes sieht wie folgt aus:

  <tab id="tabBCM" label="BCM">
    <group id="grpEinstellungen" label="Einstellungen">
      <button id="cmdKonfigurationImpact" imageMso="FieldList" label="Konfiguration Impactbewertung" onAction="cmdKonfigurationImpact" size="large" supertip="Öffnet den Dialog zur Konfiguration der Impactbewertung des Kernprozesses" screentip="Dialog: Konfiguration"></button>
      <button id="cmdKonfiguration" imageMso="ControlLayoutStacked" label="Konfiguration Betrachtungshorizont" onAction="cmdKonfiguration" size="large" supertip="Öffnet den Dialog zur Konfiguration" screentip="Dialog: Konfiguration"></button>
      <button id="cmdBasisdaten" imageMso="ControlLayoutTabular" label="Basisdaten (Interview BIA)" onAction="cmdBasisdaten" size="large" supertip="Öffnet den Dialog zur Eingabe der Basisdaten" screentip="Dialog: Basisdaten"></button>

Das Ergebnis sieht wie folgt aus:

Mit fällt auf, dass auf einem kleinen Bildschirm (beispielsweise Laptop) die Gruppen zusammengepackt werden. Diese Darstellung gefällt mir nicht:

Zum Glück entdecke ich, dass man in die Gruppen auch Bilder (imageMso) einfügen kann. Und nun wird mir der Zweck klar: beim Verkleinern werden diese Symbole angezeigt. Das werde ich nun immer machen:

An der Darstellung des Menübandes hat sich nichts geändert:

Auf meinem Grabstein soll stehen: „Guck nicht so doof, ich läge jetzt auch lieber am Strand!!!“

Nein, nein, nein – so nicht! Bitte verbindet keine Zellen! Das bringt nur Ärger! Einige Ärgernisse habe ich hier schon beschrieben – über ein neues bin ich vor einigen Tagen gestolpert: Wenn A1 und A2 verbunden sind, dann liefert:

MsgBox Range(„A1“).Offset(0, 2).Address

Die Zelladresse C1, dagegen:

MsgBox Range(„A1“).Offset(2, 0).Address

ergibt: A4! UUUAAAAH!

Also: bitte, bitte, bitte! – Nicht verbinden!

SO NICHT!

Home is, where WIFI is.

Dürfen die das? Ich wollte gerade in Excel mit VBA programmieren, öffne den VBA-Editor:

und bin ein bisschen verblüfft. Wo kommt denn DER Code her? Ich überlege. Stimmt: ich habe vor Kurzem das Add-In „Analyse-Funktionen“ installiert. Ich wollte etwas in einem der Assistenten nachschauen … Das hat man nun davon!

Weltmacht mit drei Buchtstaben? ICH!

Ich habe für eine Firma ein kleines Add-In geschrieben: Daten werden von A nach B übertragen und andere Daten zurück von B nach A. Um die korrekten Daten zu ermitteln verwende ich die Formeln – man kann es mit SVERWEIS machen – ich habe mich für die flexiblere Variante INDEX und VERGLEIC entschieden. Diese Formel wird in den Bereich eingefügt, der Bereich wird kopiert und als Werte wieder eingefügt:

On Error Resume Next
[...]
xlBereich.Copy
xlBereich.PasteSpecial Paste:=xlPasteValues

Das Programm läuft. Nach einigen Tagen erhalte ich einen Anruf:ein Fehler ist aufgetreten. Ich schaue es mir an. Sie Anwenderinnen haben auf den Bereich einen Filter gesetzt und gefiltert! Klaro – nun kann mein Makro nicht mehr die Inhalte als Werte einfügen:

Also überprüfe ich, ob ein Filter eingeschaltet ist. Wenn ja – dann wird er ausgeschaltet. Und schon kann das Programm wieder sauber die Daten übertragen …

Wenn mir langweilig ist, gehe ich in einem Bekleidungsgeschäft in eine Umkleidekabine und rufe: „Hey, hier ist kein Toilettenpapier!“

Ich programmiere ein Formular für einen Kunden. Einige Zellen sollen dynamische gesperrt oder entsperrt werden. Ich erhalte eine Fehlermeldung:

Seltsam: Der Befehl:

MsgBox Range(„K158“).Locked liefert False

Okay – noch ein Versuch:

Nutzt nichts! Ich schaue nach:

Ah! Verbundene Zellen. Ich darf nicht eine Zelle aus diesem Zellverbund sperren oder entsperren – dies funktioniert nur bei der ersten (hier: C158). Könnte mir Excel VBA ja auch sagen …

Pornos geben jungen Leuten eine falsche Vorstellung davon, wie schnell man heute bei Handwerkern einen Termin bekommt.

Böses Excel! Ich erstelle ein dynamisches Excel-Formular mit VBA. Ich muss bestimmte Stellen ermitteln – beispielsweise die Position „7.1.“ Die Funktion

=VERGLEICH(„7.1.“;A:A;0)

liefert die Zeilennummer. Ich versuche es mit VBA:

Application.WorksheetFunction.Match(„7.1“, ThisWorkbook.Worksheets(„Interviewfragebogen“).Range(„A:A“), 0)

Eine Fehlermeldung ist die Folge:

Gefühlte 120 Versuche, warum WorksheetFunction.Match nicht funktioniert und wie man diese Funktion richtig schreibt. Die Match-Eigenschaft des WorksheetFunction-Objektes kann nicht zugeordnet werden. Bis ich dahinterkomme, dass ich nicht „7.1“ suche, sondern „7.1.“ Der letzte Punkt hat gefehlt. Während die Funktion

=VERGLEICH(„7.1“;A:A;0)

den Fehler #NV erzeugen würde, schreibt WorksheetFunction.Match erst gar nichts in die Zelle, beziehungsweise in das Meldungsfenster. VBA für Excel könnte ja wenigstens sagen, dass die FUNKTION okay ist, dass sie allerdings einen fehlerhaften WERT liefert. Aber nicht so etwas!

Du stehst gut gelaunt auf, fühlst dich gut und dann triffst du Menschen …

Ich erstelle für einen Kunden ein Programm. Per VBA greift Visio auf Excel zu. Dabei wird überprüft, ob Excel (beziehungsweise eine bestimmte Datei) schon offen ist:

On Error Resume Next

' -- greife auf das offene Excel zu
Set xlApp = GetObject(, "Excel.Application")
If Err.Number <> 0 Then
    ' -- falls Excel nicht offen ist: öffne Excel
    Set xlApp = CreateObject("Excel.Application")
    xlApp.Visible = False
End If

On Error GoTo 0

Die Zeile GetObject(, „Excel.Application“) liefert einen Fehler, wenn sich der Cursor in einer Zelle befindet:

Eigentlich sollte es automatisch (automatisiert) gehen …

Ich kaufe mir jetzt ein Fernglas. Dann sehe ich weiter.

Eine hübsche Frage letzte Woche auf dem Excelstammtisch: In einer Arbeitsmappe befinden sich mehrere Tabellenblätter. Ich arbeite auf einem Blatt, wechsel zu einem anderen, arbeite dort und möchte nun zum ersten Blatt zurückspringen, auf dem ich zuvor gearbeitet habe. In Word gibt es dafür eine Taste: [Umschalt] + [F5]. Und Excel? Leider nichts. Also ein kleines Makro:

In einem Modul deklariere ich eine globale Stringvariable und verwende sie, um zu dem Blatt zu springen:

Public strBlattname As String

Sub GeheZuLetztemBlatt()

On Error Resume Next

ActiveWorkbook.Sheets(strBlattname).Activate

End Sub

Und nun in „DieseArbeitsmappe“. Im Ereignis

Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)

strBlattname = Sh.Name

End Sub

„merkt“ sind VBA nun in der Variablen strBlattnamen den Namen des Blattes, von welchem du aus weggesprungen bist. Beim Öffnen der Datei kann dieses Makro noch auf eine Taste gelegt werden, beispielsweise Umschalt + F5:

Private Sub Workbook_Open()

Application.OnKey „+{F5}“, „GeheZuLetztemBlatt“

End Sub

In dieser Datei funktioniert es. Man kann es auch als Add-In speichern, damit es in jeder Datei funktioniert. Dazu muss man ein Public WithEvents … deklarieren.

Liebes Mathebuch, werd erwachsen und lös deine Probleme allein

Hallo Rene,

[…]

Wenn ich Dir schon mal schreibe.. Ich hätte da eine kleine Excell-Anwenderfrage an dich? Ist es möglich wenn man bei Excell z.B. ein Objekt einfügt und dieses dann verschiebt die Koordinaten dieses Objektes auslesen kann?

Liebe Grüße aus Hessen

Nils

#####

Hallo Nils,

Klar – mit den Eigenschaften Left und Top. Bspw. so:

Dim s As Worksheet

Dim o As OLEObject

Set s = ActiveSheet

 

Set o = s.OLEObjects(1)

MsgBox o.Left & “ x “ & o.Top

 

Du musst natürlich die Objekte „sauber“ adressieren.

Selbstgespräche geben einem die Chance, Recht zu behalten.

Das ist mir noch nie aufgefallen. Heute in der VBA-Schulung. Ich gebe als Übung auf zwei Makros zu erstellen: eines soll sämtliche Tabellenblätter schützen, eines soll den Blattschutz aufheben. Ein Teilnehmer testet und bemerkt ein Ruckeln:

Und hier der Code – falls jemand selbst testen möchte. Das Ruckeln erscheint beim Schutzaufheben:

Sub AlleBlätterSchützen()
Dim i As Integer

For i = 1 To ActiveWorkbook.Sheets.Count
ActiveWorkbook.Sheets(i).Protect
Next

End Sub

Sub Blattschutzaufheben()
Dim i As Integer

For i = 1 To ActiveWorkbook.Sheets.Count
ActiveWorkbook.Sheets(i).Unprotect
Next

End Sub

Auf meinem Grabstein soll später mal stehen „Ich würd‘ jetzt auch lieber am Strand liegen…“

Haben die den Cosinus vergessen?

Nicht, dass ich sie unbedingt benötige – aber ich wollte in VBA etwas bei den Worksheetfunctions nachsehen. Dort kann man sämtliche Excel-Funktionen verwenden. Sämtliche? Nun: Sinus, Cosinus und Tanges finde ich nicht – nur ACos (ArcCos), ASin (ArcSin), Sinh, Cosh, … Auch der Objektkatalog zeigt diese trigonometrischen Funktionen nicht an.

Erzähle nicht, wie Du warst, sondern zeige, wie Du jetzt bist.

Wie oft muss ich es noch sagen: Programmiert sauber!

In einer Firma lief unter Excel 2007 ein Programm mit folgendem Code:

Dim BlattName

Sheets(„Diagramme“).Visible = True
Sheets(„nocheins“).Visible = True

BlattName = ActiveSheet.Name

Abgesehen davon dass die Variable „BlattName“ nicht sauber von Typ As String deklariert wurde, dass die Eigenschaft Visible eigentlich den Wert der Konstanten xlSheetVisible erhalten sollte und nicht True (True ist 1; xlSheetVisible ist -1) läuft es unter Excel 2016 an die Wand. Der Grund:

Nach Sheets(„Diagramme“).Visible = True ist der Fokus noch auf dem Blatt von dem aus der Code gestartet wurde. Werden jedoch zwei Blätter eingeblendet, wechselt Excel in der Version 2016 nun auf eines der eingeblendeten Blätter. Der Blattname lautet nun nicht mehr wird das ursprünglich aktive Blatt, sondern wie eines der Blätter, die zuvor ausgeblendet waren.

Das kann man gut mit einem Meldungsfenster verifizieren:

Sheets(„Diagramme“).Visible = True
Sheets(„nocheins“).Visible = True

BlattName = ActiveSheet.Name

MsgBox BlattName

Sauber programmieren heißt beispielsweise:

Dim BlattName As String
Dim xlBlattDiagramme As Worksheet
Dim xlBlattNochEins As Worksheet
Dim xlBlattAktual As Worksheet

Set xlBlattAktual = ActiveSheet
Set xlBlattDiagramme = Sheets(„Diagramme“)
Set xlBlattNochEins = Sheets(„nocheins“)

xlBlattDiagramme.Visible = xlSheetVisible
xlBlattNochEins.Visible = xlSheetVisible

BlattName = xlBlattAktual.Name
‚ wird eigentlich nicht mehr benötigt

MsgBox BlattName

 

Vorhin war’s noch da

Ich schaue mir eine fremde Datei an. Auf einem Tabellenblatt befindet sich ein Diagramm. Ich versuche herauszufinden, woher es die Daten bezieht. Die Quelle liegt auf einem anderen Blatt. Ich will zurück zu dem Blatt „Diagramm“ – doch das ist verschwunden.

Ich brauche schon eine Weile, bis ich dahiner komme:

In VBA befindet sich im Objekt Worksheet beim Ergebnis Deactivate folgender Befehl:

Private Sub Worksheet_Deactivate()
Sheets(„Diagramm“).Visible = xlSheetHidden
End Sub

Interessanter Mechanismus: Lieber Anwender, sobald du das Blatt verlässt, bekommst du es nicht mehr zu Gesicht. Natürlich kann man es sich über eine Schaltfläche wieder einblenden lassen …

Being funny is not everyone’s first choice

Auf nichts ist mehr Verlass!

Für einen Kunde habe ich ein Add-In für Excel erstellt. Am Ende werden daten in einer Pivottabelle zusammengefasst. Der Kunde möchte noch ein bisschen Farbe ins Spiel bringen. Kein Problem, denke ich – in Pivottabellen lustige Formatierungen einschalten kann man mittels der Pivottable-Formate erreichen. Doch wie heißen sie in Excel? Der Makrorekorder hilft. Ich zeichne die Farbe auf:

ActiveWorkbook.TableStyles(„Rene-Stil“).TableStyleElements(xlColumnStripe1). _
Clear
With ActiveWorkbook.TableStyles(„Rene-Stil“).TableStyleElements( _
xlColumnStripe1).Interior
.ThemeColor = xlThemeColorAccent4
.TintAndShade = 0.399914548173467
End With

Wunderbar!

Und Linien? Ich zeichne auf:

With ActiveWorkbook.TableStyles(„Rene-Stil“).TableStyleElements( _
xlColumnStripe1).Borders(xlEdgeTop)
.ColorIndex = xlAutomatic
.TintAndShade = 0
.Weight = xlThin
.LineStyle = xlNone
End With
With ActiveWorkbook.TableStyles(„Rene-Stil“).TableStyleElements( _
xlColumnStripe1).Borders(xlEdgeBottom)
.ColorIndex = xlAutomatic
.TintAndShade = 0
.Weight = xlThin
.LineStyle = xlNone
End With
With ActiveWorkbook.TableStyles(„Rene-Stil“).TableStyleElements( _
xlColumnStripe1).Borders(xlEdgeLeft)
.ColorIndex = xlAutomatic
.TintAndShade = 0
.Weight = xlThin
.LineStyle = xlNone
End With
With ActiveWorkbook.TableStyles(„Rene-Stil“).TableStyleElements( _
xlColumnStripe1).Borders(xlEdgeRight)
.ColorIndex = xlAutomatic
.TintAndShade = 0
.Weight = xlThin
.LineStyle = xlNone
End With

[…]

Ich teste – lasse den Code abspielen. Was passiert? Nichts! Teste erneut, …

Ich habe eine Weile benötigt, bis ich gesehen hat, dass der Makrorekorder eine dünne schwarze Linie mit der Eigenschaft LineStyle = xlNone aufzeichnet hat ?!? Also: raus damit. Code noch „putzen“ – und schon läuft es!

xlDateiNeu.TableStyles.Add „Rene-Stil“

With xlDateiNeu.TableStyles(„Rene-Stil“)
.ShowAsAvailablePivotTableStyle = True
.ShowAsAvailableTableStyle = False
.ShowAsAvailableSlicerStyle = False
.ShowAsAvailableTimelineStyle = False
End With

xlDateiNeu.TableStyles(„Rene-Stil“).TableStyleElements(xlColumnStripe1).StripeSize = 2
With xlDateiNeu.TableStyles(„Rene-Stil“).TableStyleElements(xlColumnStripe1).Interior
.ThemeColor = xlThemeColorAccent4
.TintAndShade = 0.399945066682943
End With
With xlDateiNeu.TableStyles(„Rene-Stil“).TableStyleElements(xlColumnStripe1).Borders(xlEdgeTop)
.ColorIndex = xlAutomatic
.TintAndShade = 0
.Weight = xlThin
‚.LineStyle = xlNone
End With
With xlDateiNeu.TableStyles(„Rene-Stil“).TableStyleElements(xlColumnStripe1).Borders(xlEdgeBottom)
.ColorIndex = xlAutomatic
.TintAndShade = 0
.Weight = xlThin
‚.LineStyle = xlNone
End With
With xlDateiNeu.TableStyles(„Rene-Stil“).TableStyleElements(xlColumnStripe1).Borders(xlEdgeLeft)
.ColorIndex = xlAutomatic
.TintAndShade = 0
.Weight = xlThin
‚.LineStyle = xlNone
End With
With xlDateiNeu.TableStyles(„Rene-Stil“).TableStyleElements(xlColumnStripe1).Borders(xlEdgeRight)
.ColorIndex = xlAutomatic
.TintAndShade = 0
.Weight = xlThin
‚.LineStyle = xlNone
End With

Das Problem ist nicht mein leichter Knall. Das Problem ist jemanden zu finden, der einen möglichst kompatiblen Knall hat.

Ich versuche mittels VBA ein Bild auf 10 cm zu verkleinern. Beim ersten teil hilft der Makrorekorder. Jedoch: wenn das Bild nicht im Querformat, sondern im Hochformat vorliegt, muss ich die Height und nicht die Width verändern. Also gehe ich auf die Suche nach dem Befehl „Winkel“. In Visio heißt er Angle. Jedoch in Excel VBA?

Ein Blick in den Eigenschaften-Dialog (Größe und Position) zeigt: auf diesem Dialog heißt er „Drehung“. Und richtig: unter „Rotation“ werde ich fündig.

Kann Microsoft die Objekte, Eigenschaften und Methoden in den einzelnen Applikationen nicht gleich benennen? Es nervt!

Wer will schon den aalglatten Prinzen, wenn man schon den Hofnarren mit Dreitagebart haben kann?

Ist Ihnen das schon aufgefallen:
In einer Excelmappe gibt es zwei Tabellenblätter: Tabelle1 und Tabelle2. Tabelle1 liegt links; Tabelle2 rechts. Tabelle2 wird ausgeblendet.


Wenn man nun Tabelle1 kopiert: Kopie erstellen (ans Ende stellen) und anschließend Tabelle2 wieder einblendet: Liegt die Kopie nun links oder rechts von Tabelle2?


Die Lösung: sie liegt links von der ehemals ausgeblendeten Tabelle. „Ans Ende stellen“ heißt also: „Ans Ende der sichtbaren Tabellen stellen“. Ist das schlimm? Man sieht doch, wo die Tabellen liegen?
Die Antwort:
Wenn Sie per Programmierung ein Blatt in eine andere Datei kopieren, beispielsweise so:
Dim xlBlatt As Worksheet
Dim xlDatei As Workbook

Set xlDatei = Application.Workbooks.Open(„D:\Excel\Testdatei.xlsx“)
Set xlBlatt = ThisWorkbook.Worksheets(„Tabelle1“)
xlBlatt.Copy After:=xlDatei.Worksheets(xlDatei.Worksheets.Count)

MsgBox xlDatei.Worksheets(xlDatei.Worksheets.Count).Name
Nun liefert das Meldungsfenster nicht den Namen des kopierten Blattes, sondern den Namen des letzten Blattes (wenn es ausgeblendet war). Und: leider liefert die Methode Copy kein Objekt, also kein Verweis auf ein Tabellenblatt zurück.
Heißt: gut aufpassen! Sonst nervt das Ergebnis!

Ich bin im Niveau ganz flexibel

Ich versuche per VBA benutzerdefinierte Eigenschaften an eine Datei zu binden. Nichts leichter als das, denke ich:

20170126Benutzereigenschaften01

Man definiert eine Variable vom Typ CustomDocumentProperties (oder Property) und fügt zu der Sammlung ein weiteres Element mit der Methode Add hinzu. Sie möchte Name und Value. Klingt vernünftig. Ich werde jedoch eines Besseren belehrt:

20170126Benutzereigenschaften02

Typen unverträglich? Okay – dann ohne Objektverweis:

20170126Benutzereigenschaften03

Falsch Anzahl an Argumenten? Aber IntelliSense hat mir doch … Ein Blick in die Hilfe verrät, dass ich die CustomDocumentProperties vom Typ DocumentProperties deklarieren muss. Aha:

20170126Benutzereigenschaften04

Und richtig: Dort wird noch zwingend der Parameter „LinkToContent“ verlangt.

Nächster Test:

20170126Benutzereigenschaften05

??? Etwas probieren und schon habe ich die Lösung: Obwohl die Eigenschaft „Type“ in eckigen Klammern, also optional, angegeben wurde, ist dieser Wert zwingend erforderlich.

Kaum probiert man eine halbe Stunde – schon klappt es auch. Flexibilität braucht man schon – nicht nur im Niveau:

20170126Benutzereigenschaften06

we are not amused

Wirklich erstaunlich. In einer Excel sind mehrere Tabellenblätter ausgeblendet:

ausgeblendete Tabellenblätter

ausgeblendete Tabellenblätter

Die Codezeile:

ActiveWorkbook.Worksheets(„Tabelle4“).Activate

selektiert das letzte Blatt und liefert keinen Fehler.

Auch folgender Sachverhalt ist amüsant und erstaunlich:

Der Teilnehmer der VBA-Schulung wollte die Anzahl der Zeilen eines Bereiches mit:

MsgBox ActiveSheet.Range(„A1“).CurrentRegion.Rows.Count

ermitteln. Statt dessen vertippte er sich und schrieb:

MsgBox ActiveSheet.Range(„A1“).CurrentRegion.Count

CurrentRegion.Count liefert die Anzahl der Zellen des Bereichs. Ich hätte etwas anderes erwartet:

20160628Currentregion

Ich rücke ja schon – aber ich sehe den Schlauch nicht auf dem ich stehe

Hi. Was heißt hier „Objekt erforderlich“. Ich finde den Fehler in der Zeile

lngZeilen = xlZielZelle.CurrentRegion.Rows.Count

nicht. Einige Zeilen zuvor habe ich doch gesetzt:

Set xlZielZelle = xlZielBlatt.Range(„A1“)

Warum mag VBA das Objekt nicht?

Wo ist das fehlende Objekt?

Wo ist das fehlende Objekt?

Die Antwort: Dahinter liegt ein hübscher Denkfehler: Es ist richtig: Sie setzen

Set xlZielZelle = xlZielBlatt.Range(„A1“)

Allerdings mit

xlZielBlatt.Rows(„1:3“).Delete Shift:=xlUp

löschen Sie drei Zeilen, damit auch die Zelle A1 und damit wiederum den Verweis auf diese Zelle. Also – einfach noch einmal setzen nach dem Löschen:

Set xlZielZelle = xlZielBlatt.Range(„A1“)

Dann klappt es.

 

Workbooks – zwei Seelen wohnen ach in meiner Brust

In VBA bedeutet die Collection Workbooks einmal die Sammlung aller schon offenen Dateien, einmal die Sammlung der noch nicht offenen Dateien. Ist das nicht unlogisch?

Workbooks - wat is dat?

Workbooks – wat is dat?

Das ist richtig – das ist nicht ganz glücklich formuliert. Gemeint ist: Workbooks.Count, beziehungsweise Workbooks(1) aus der Sammlung der Dateien wird die Dateianzahl, beziehungsweise das Element mit der Nummer 1 herausgegriffen. Workbooks.Open, beziehungsweise Workbooks.Add bedeutet: Zu der Sammlung wird ein neues Element hinzugefügt (eine neue Instanz eingefügt). Sie haben recht: vielleicht hätte man zwei verschiedene Begriffe wählen sollen – Programmieranfänger wundern sich immer ein wenig …

 

Wo ist der Remote-Server-Computer

In einem Programm, das ich in VBA geschrieben habe, erscheint manchmal die Fehlermeldung: Der Remote-Server-Computer existiert nicht oder ist nicht verfügbar. Wo bitte steht denn mein Remote-Server-Computer?

Wo ist der Remote-Server-Computer?

Wo ist der Remote-Server-Computer?

Diese Meldung kann zwei Ursachen haben. Entweder Sie greifen mit einer Objektvariablen auf ein anderes Programm (beispielsweise Word oder Access) zu und schließen per Hand (oder per Programmierung) dieses Programm.

Oder Sie greifen auf ein anderes Programm zu und löschen nicht „sauber“ die Objektvariablen. Auch wenn Microsoft behauptet, dass eine Garbage-Collection die Variablen „sauber“ putzen würde, stelle ich ab und zu (nicht immer!) fest, dass dies nicht der Fall ist. Also, wenn Sie beispielsweise per Programmierung Word öffnen (Sie müssen natürlich einen Verweis auf die Word-Bibliothek setzen):

Dim wdApp As Word.Application
Dim wdDatei As Word.Document
Set wdApp = New Word.Application
wdApp.Visible = True
Set wdDatei = wdApp.Documents.Add

Dann sollten Sie am Ende sämtliche Objektvaribalen leeren. Und zwar so.
Set wdDatei = Nothing
Set wdApp = Nothing

Und bitte auch in der richtigen Reihenfolge – von „klein“ nach „groß“.

Aufzählungslisten

Kennen Sie das? Sie verwenden ein Objekt in VBA, setzen den Punkt dahinter, aber VBA verweigert die Anzeige der Auflistung.

Während Range(„A1“). funktioniert, geht es beispielsweise bei Cells(1, 1) nicht.

Während es bei ActiveWorkbook klappt, funktioniert es bei ActiveSheet nicht.

Ich weiß nicht, warum es bei den meisten Objekten funktioniert, bei einigen jedoch nicht. Aber ich weiß, wie man immer die Aufzählungsliste angezeigt bekommt:

Verwenden Sie eine Objektvariable. Also beispielsweise so:

Dim xlBlatt As Worksheet
Set xlBlatt = ActiveSheet
xlBlatt. <- Hier funktioniert es

Dim xlZelle As Range
Set xlZelle = Cells(1, 1)
xlZelle <- Hier funktioniert es

Nicht immer erhält man die Listen der Eigenschaften und Methoden.

Nicht immer erhält man die Listen der Eigenschaften und Methoden.