4k Aufrufe
Gefragt in Tabellenkalkulation von erne Einsteiger_in (73 Punkte)
Hallo zusammen,

Im folgenden Code prüfe ich ob eine globale Variable ungleich -1 ist, wenn nein enthält sie die Spaltenzahl von Daten aus einer Spalte die ich von Dezimal in Hexadezimal umwandele.
Ausserdem möchte ich den Wert in Spalte B kopieren, weiss hier aber nicht, wie ich das VBA sagen soll...


If giCOOLINSigPos_DFR_PRG <> -1 Then
Range(Cells(2, giCOOLINSigPos_DFR_PRG + 1), Cells(lDataRows, giCOOLINSigPos_DFR_PRG + 1)).HorizontalAlignment = xlRight
For Each DezToHexValue In Range(Cells(2, giCOOLINSigPos_DFR_PRG + 1), Cells(lDataRows, giCOOLINSigPos_DFR_PRG + 1))
If DezToHexValue <> "" Then
DezToHexValue = WorksheetFunction.Dec2Hex(DezToHexValue, 2)
???Kopiere DezToHexValue nach Spalte B???
End If
Next
End If


Vielen Dank für Antworten im vorraus
Gruß Erne

8 Antworten

0 Punkte
Beantwortet von saarbauer Profi (15.6k Punkte)
Hallo,

geht so:

Cells(????,2).VALUE = DezToHexValue

an derStelle von ???Kopiere DezToHexValue nach Spalte B??? einbauen.

Für die Fragezeichen ist die Zeile einzusetzen.

Gruß

Helmut
0 Punkte
Beantwortet von erne Einsteiger_in (73 Punkte)
Hallo Helmut,

danke für die Antwort.
Funktioniert, so wie Du gesagt hast, ich hatte noch das Problem, nicht zu wissen in welcher Zeile ich bin, aber mit

Cells(DezToHexValue.Row, 2).Value = DezToHexValue

geht das nun. Allerdings braucht die Berechnung eine ganze Weile.
Ich hatte vorher eine Version, in der die Spalten zum kopieren fest waren und hatte das so gelöst:

Range("B2").Select
ActiveCell.FormulaR1C1 = "=RC[1]+RC[3]+RC[13]+RC[16]+RC[18]+RC[20]+RC[22]+RC[29]+RC[31]+RC[37]+RC38"
Selection.AutoFill Destination:=Range("B2:B" & lDataRows), Type:=xlFillDefault

Gibt es hier ein ähnliche Möglichkeit? Die Positionen der Spalten sind ja durch die globalen Variablen beschrieben.
Geht es zum Beispiel sich den String zusammenzubasteln? Etwa in der Form (ich kenn die Stringfunktionen nicht):

Dim sFormel As String

sFormel = "=RC["

If giVar1 <> -1 Then
sFormel = sFormel & giVar1 & "]+RC["
ElseIf giVar2 <> -1 Then
sFormel = sFormel & giVar2 & "]+RC["
ElseIf giVar3 <> -1 Then
sFormel = sFormel & giVar2 & "]"
End If

Range("B2").Select
ActiveCell.FormulaR1C1 = sFormel
Selection.AutoFill Destination:=Range("B2:B" & lDataRows), Type:=xlFillDefault


Gruß Erne
0 Punkte
Beantwortet von saarbauer Profi (15.6k Punkte)
Hallo,

da ich aus den übermittelten Fragmenten nicht so richtig den Zusammenhang der von dir durchgeführten Berechnungen erkenne ist es Schwierig dir einen richtigen Rat zu geben.

Ich komme mit deinen Berechnungen so nicht klar.

Gruß

Helmut
0 Punkte
Beantwortet von erne Einsteiger_in (73 Punkte)
Hallo Helmut,

das Problem ist folgendes: Ich möchte pro Zeile aus einigen bestimmten Spalten, die Zelle nach Spalte B kopieren, die nicht leer ist.
Die Spaltenzahlen, in denen der Wert gesucht werden soll, sind in globalen Variablen abgespeichert.

In der vorigen Variante waren die Spalten, in denen sich der Wert befinden kann, fix. Nun habe ich in Spalte B alle in Frage kommenden Spalten addiert, da nur eine Spalte einen Wert enthalten kann, brauchte ich nicht jede Spalte überprüfen.
Range("B2").Select
ActiveCell.FormulaR1C1 = "=RC[1]+RC[3]+RC[13]+RC[16]+RC[18]+RC[20]+RC[22]+RC[29]+RC[31]+RC[37]+RC38"
Selection.AutoFill Destination:=Range("B2:B" & lDataRows), Type:=xlFillDefault

Hier ist ausgehend von Spalte B Spalte C (RC[1]), Spalte E (RC[3]), Spalte M (RC[13]) etc addiert worden, da alle Spalten bis auf eine leer sind, wird somit der gesuchte Wert nach B kopiert.

In der aktuellen Variante können sich die Spalten ändern, in denen der zu kopierende Wert steht. Die Spaltenzahlen sind in globalen Variablen gespeichert, wenn sie den Wert -1 enthält, ist die entsprechende Spalte nicht relevant, oder aber sie enthält den Wert einer Spaltenzahl. Für jede mögliche Spalte gibt es eine globale Variable.
Meine Frage war nun, ob man die Methode .FormulaR1C1 auch hier auf Spalte B anwenden kann, wenn man einen String enstsprechend der Werte der globalen Variablen baut; also nicht so:

ActiveCell.FormulaR1C1 = "=RC[1]+RC[3]+RC[13]+RC[16]+RC[18]+RC[20]+RC[22]+RC[29]+RC[31]+RC[37]+RC38"
sondern so:

ActiveCell.FormulaR1C1 = sFormel,

wobei hier der String sFormel noch zusammengebaut werden müsste:
(Hier im Text giVar1 etc. als globale Variablen)

Dim sFormel As String

sFormel = "=RC["

If giVar1 <> -1 Then
sFormel = sFormel & giVar1 & "]+RC["
ElseIf giVar2 <> -1 Then
sFormel = sFormel & giVar2 & "]+RC["
ElseIf giVar3 <> -1 Then
sFormel = sFormel & giVar3 & "]"
End If





Ich hoffe, ich habe das Problem einigermassen verständlich beschrieben.

Danke und Gruß
Erne
0 Punkte
Beantwortet von m-o Profi (22.7k Punkte)
Hallo Erne,

so wie du die Formel zusammenbauen willst geht das nicht, da wenn z.B. die erste Wenn-Abfrage wahr ist, die anderen Abfrage-Teile nicht mehr geprüft werden und du dann nur die erste Variable in deiner Formel zum Einfügen hast.

Probier mal es so:

Sub Formel()

Dim sFormel As String

sFormel = "="

If givar1 <> -1 Then sFormel = sFormel & "RC[" & givar1 & "]"
If giVar2 <> -1 Then sFormel = sFormel & "+RC[" & giVar2 & "]"
If giVar3 <> -1 Then sFormel = sFormel & "+RC[" & giVar3 & "]"

With Range("B2")
.FormulaR1C1 = sFormel
.AutoFill Destination:=Range("B2:B" & lDataRows), Type:=xlFillDefault
End With

End Sub


Gruß

M.O.
0 Punkte
Beantwortet von erne Einsteiger_in (73 Punkte)
Hallo M.O.

es funktioniert, das Makro läuft ;-)
Danke für die Antwort!

Ich hätte noch eine Sache: Um mir eine Schleife zu sparen, habe ich die in Frage kommenden Werte in Hexadezimal umgewandelt, bevor ich sie nach Spalte B kopiert habe. Jetzt funktioniert die Formel nicht mehr für die Werte in denen in der Hexzahl ein Buchstabe vorkommt. Also interpretiert VBA diese Werte als Text und kann sie nicht berechnen (vermute ich).
Kann man mit einer ähnlichen Formel auch Hexzahlen addieren?

Gruß
Erne
0 Punkte
Beantwortet von m-o Profi (22.7k Punkte)
Hallo Erne,

leider kann ich dir nicht ganz folgen.

Addierst du die Hexadezimalen Zahlen per VBA oder soll das die Formel, die du in B2 schreibst erledigen?
Wie wandelst du denn die Zahlen in hexadezimale Zahlen? Etwa in der Tabelle mit der Formel DEZINHEX?

Falls das so ist, müssten ja die Dezimalzahlen ebenfalls in der Tabelle stehen. Addiere doch dann einfach die Dezimalzahlen und ändere die Formel zum Addieren entsprechend um (die Spaltenbezüge in den Variablen musst du natürlich auch anpassen):

Sub Formel_hex()

Dim sFormel As String

sFormel = "=DEC2HEX("

If givar1 <> -1 Then sFormel = sFormel & "RC[" & givar1 & "]"
If giVar2 <> -1 Then sFormel = sFormel & "+RC[" & giVar2 & "]"
If giVar3 <> -1 Then sFormel = sFormel & "+RC[" & giVar3 & "]"

'hexadezimale Zahlen mit 4 Stellen anzeigen, ggf. ändern
sFormel = sFormel & ",4)"

With Range("B2")
.FormulaR1C1 = sFormel
.AutoFill Destination:=Range("B2:B" & lDataRows), Type:=xlFillDefault
End With

End Sub


Addierst du die Werte per VBA so gibt es die Funktion HEX.

Gruß

M.O.
0 Punkte
Beantwortet von erne Einsteiger_in (73 Punkte)
Hallo M.O.

die erste Variante wäre die Richtige gewesen, allerdings habe ich einen Denkfehler gemacht, und muss die zweite Schleife sowieso durchlaufen...

Es läuft, vielleicht nicht perfekt, und das ist ja die Hauptsache.

Vielen Dank für eure Mühe und echt sachkundigen Antworten, und ich werde auch nicht müde Supportnet weiterzuempfehlen!

Gruß
Erne
...