Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1512to1516
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Input/Output durch VBA Code

Input/Output durch VBA Code
22.09.2016 22:13:11
Gröver
Liebe Teilnehmer am Forum,
ich wende mich mit dem folgenden, allgemeinen Problem natürlich vor allem
an VBA Profis:
Bekanntlich wird die Effizienz von VBA Code in der Hauptsache von der Anzahl
der "Interaktionen" zwischen VBA Excel und dem VBA Code bestimmt. So benötigt
das Einlesen der Inhalte von 100 Zellen mit einer einzigen Anweisung
(1) {Variant-Variable} = {umfassender Rechteck-Bereich}
nur einen Bruchteil der Laufzeit im Vergleich zu 100 Anweisungen
(2) {Variable} = {Bereich einer einzigen Zelle}
Durch (1) wird die Variant-Variable zu einer Variant-Matrix mit den Grenzen des
Rechteck-Bereichs. Selbst wenn die interessierenden Inhalte nur in einigen Zellen
im Rechteck-Bereich liegen, ist Anweisung (1) die effizientere Technik.
Das gleiche gilt ebenso für die Ausgabe mit einer Anweisung
(3) {Rechteck-Bereich} = {Variant-Matrix}
und zwar auch dann, wenn in der zuvor eingelesenen Variant-Matrix nur einigen
Matrix-Elementen geänderte Werte zugewiesen wurden.
Unglücklicherweise ist aber die Wirkung der Anweisungen (1) und direkt danach (3)
nicht "idempotent": Alle Zellen im Rechteck-Bereich verlieren ihre etwaigen Formeln.
Statt dessen werden die momentanen Formelergebnisse zum jeweiligen Zelleninhalt.
F r a g e: Gibt es irgend eine Bedingung mit der Wirkung, dass VBA Excel die
zu einem Matrix-Element gehörende Zelle unverändert lässt, aber das Matrix-Element
der Zelle dann zuweist, wenn diese Bedingung nicht auf die Zelle zutrifft.
I n f o: Ein Matrix-Element wird z.B. ignoriert, wenn es nicht mit der ersten
Zelle einer Verbundzelle korrespondiert. Aber diese Bedingung ist nutzlos, weil
man dafür ja das Layout des Tabellenblattes (temporär) ändern müsste.
V e r s i o n: Gibt es eine positive Antwort, dann ist natürlich auch wichtig,
für welche Office Version die Antwort gilt.
Ich verwende (wegen des Menü-Designs) noch Office 2003.
Im Voraus besten Dank und freundliche Grüße
Bernhard Gröver

3
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Input/Output durch VBA Code
23.09.2016 12:33:16
Rudi
Hallo,
mit Array = Range(...) liest du die Werte der Zellen aus, da .Value die Standardeigenschaft des Range-Objekts ist. Lies statt dessen die Formeln in das Array ein.
Sub aaa()
Dim a
a = Range("A1:D10").Formula
a(5, 3) = "xxxx"
Range("A1:D10").Formula = a
End Sub
Gruß
Rudi
AW: Input/Output durch VBA Code
24.09.2016 22:35:11
Gröver
Ich danke Rudi für die rasche Antwort. Ich wollte gerade eine Lösung auf Basis der Methode
{Range}.PasteSpecial SkipBlanks:=True fabrizieren, die natürlich auch ziemlich aufwändig ist.
Da kam der Hinweis, anstelle der Value- die Formula-Eigenschaft zu verwenden gerade rechtzeitig.
Dennoch bin ich nicht zufrieden. Denn die bedingte Formatierung (mit der HG-Farbe Rot) der Zellen
im Bereich schlägt kurzzeitig zu. Wenn es doch auch bei Ausgaben per Value-Eigenschaft so etwas
Ähnliches geben würde, wie das Argument SkipBlanks:=True ! Dennoch besten Dank. Gruß Bernhard
Anzeige
AW: Input/Output durch VBA Code
26.09.2016 17:58:24
Michael
Hi,
1. danke an Rudi für diesen Hinweis! Weil .text nicht geht, dachte ich bislang, andere Eigenschaften (außer Std-.value) gehen auch nicht.
2. das Schreiben nicht-rechteckiger Bereiche geht nicht; eine (hier zu Testzwecken eher holprige) Variante wäre so was in der Art
Sub abc()
Dim aw, af, at
Dim z&, s&, Zoff&, Soff&
aw = Range("D4:I14").Value
af = Range("D4:I14").FormulaLocal
at = Range("D4:I14").Text
MsgBox IsNull(at) ' ergibt WAHR
Zoff = 16: Soff = 3
For z = 1 To UBound(aw)
For s = 1 To UBound(aw, 2)
If Mid(af(z, s), 1, 1)  "=" Then
Cells(z + Zoff, s + Soff) = aw(z, s)
Cells(z + Zoff, s + Soff).Interior.Color = vbGreen
End If
Next
Next
' geht nicht, weil NULL:
' Range("K17").Resize(UBound(at), UBound(at, 2)) = at
End Sub

wobei in dem Fall vielleicht
3. specialcells/xltypeconstants als range vielleicht insgesamt geeigneter wäre.
Schöne Grüße,
Michael
Anzeige

305 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige