Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1664to1668
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

Zusammengesetzter Befehl möglich?

Zusammengesetzter Befehl möglich?
08.01.2019 19:29:00
Excel2017
Hallo Forum,
ich habe da einmal eine ganz komische Frage:
ist es möglich, einen Excel-Befehl auszuführen, der sich aus einem festen String und aus dem Inhalt einer Variablen zusammensetzt. Und wenn ja, wie müsste dann so etwas aussehen.
Beispiel:
Var = ".value"
debug.print Cells(1,1)Var
Das sollte dann den Befehl "debug.print Cells(1,1).value" ausführen.
Hintergrund meiner Frage: ich möchte verschiedene Attribute aller Zellen eines Blattes ermitteln und das Ergebnis in eine Tabelle stellen. Dabei soll die Zeile 1 der jeweiligen Spalte den String enthalten, der hinter "Cells(x,y)" anzufügen wäre.
Ich kenne diese Möglichkeit aus REXX.
Danke im Voraus und Gruß
Werner

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Zusammengesetzter Befehl möglich?
08.01.2019 19:36:59
Sepp
Hallo Werner,
Dim strVar As String, varRet As Variant

strVar = "Value"

varRet = CallByName(Cells(1, 1), strVar, VbGet)

Debug.Print varRet

VBA/HTML-CodeConverter, AddIn für Office 2002-2016 - in VBA geschrieben von Lukas Mosimann. Projektbetreuung:RMH Software & Media

Code erstellt und getestet in Office 16 - mit VBAHTML 12.6.0


 ABCDEF
1Gruß Sepp
2
3

Anzeige
AW: Zusammengesetzter Befehl möglich?
08.01.2019 19:57:29
Excel2017
Hallo Sepp,
Danke für Dein Beispiel. Ich werde es morgen probieren und melde mich dann wieder.
Bis morgen.
Gruß
Werner
AW: Zusammengesetzter Befehl möglich?
09.01.2019 10:29:19
Excel2017
Hallo Sepp.
Ich habe ein paar Test mit CallByName gemacht. Dabei habe ich festgestellt, dass nur solche Aufrufe (grundsätzlich) funktionieren, bei denen ein einstufiger SubCommand mitgegeben wird.
Gebe ich als SubCmd "font.bold" mit, bringt das einen Fehler.
Ändere ich den Aufruf jedoch auf
SubCmd = "bold"
varRet = CallByName(Cells(1, 1).Font, SubCmd, VbGet)
dann funktionert der Aufruf.

Gibt es eine Möglichkeit, mehrstufige SubCmd's anzugeben?
Gruß
Werner
Anzeige
Sepp bitte melden
13.01.2019 13:15:12
Excel2017
Hallo Sepp,
hast Du meinen letzten Beitrag nicht gelesen?
Gruß
Werner
AW: Sepp bitte melden
13.01.2019 13:18:35
Excel2017
Sorry,
habe vergessen, das Kontrollkästechen zu aktivieren.
Doch, aber keine Idee! o.T
13.01.2019 18:36:09
Sepp
 ABCDEF
1Gruß Sepp
2
3

Anzeige
AW: Doch, aber keine Idee! o.T
13.01.2019 19:21:32
Excel2017
Hallo Sepp,
habe eigentlich damit gerechnet, nachdem Du keine Antwort auf meine offenen Fragen bereit gestellt hast.
Da ich davon ausgehe, dass auch viele andere dieses Problem angeschaut haben, unterstelle ich, dass keinem eine Lösung bekannt ist.
Ich werde diesen Thread deshalb als erledigt betrachten, würde mich aber dennoch freuen, wenn noch irgend jemand eine Lösung einfallen würde, und er dies hier hinterlegt.
Gruß und vielen Dank
Werner
AW: Doch, aber keine Idee! o.T
14.01.2019 18:09:56
Mullit
Hallo,
hm, Du könntest Dir schon ne Wrapper-Function basteln...wenn's schee macht...;-)
Option Explicit

Public Sub test()
Dim strSubCmd As String
Dim vntReturn As Variant
strSubCmd = "font.bold"   '// "font.italic" 
vntReturn = fncCallByName_SubCmd(Cells(1, 1), strSubCmd, VbGet)
MsgBox vntReturn
End Sub

Private Function fncCallByName_SubCmd(ByRef probjObject As Object, _
   ByVal pvstrProcName As String, ByVal pvenmCallType As VbCallType) As Variant
  Dim objReturn As Object
  Dim lngPos As Long
  lngPos = InStr(pvstrProcName, ".")
  If lngPos = 0 Then
    If Not IsObject(CallByName(probjObject, pvstrProcName, pvenmCallType)) Then _
      fncCallByName_SubCmd = CallByName(probjObject, pvstrProcName, pvenmCallType)
  Else
     Set objReturn = CallByName(probjObject, _
       Mid$(String:=pvstrProcName, Start:=1, Length:=lngPos - 1), pvenmCallType)
     pvstrProcName = Mid$(String:=pvstrProcName, Start:=lngPos + 1)
     fncCallByName_SubCmd = CallByName(objReturn, pvstrProcName, pvenmCallType)
     Set objReturn = Nothing
  End If
End Function


VBA/HTML - CodeConverter für Office-Foren
AddIn für Excel/Word 2000-2010 - komplett in VBA geschrieben von Lukas Mosimann
Projektbetreuung durch mumpel



Code erstellt und getestet in Office 14

Gruß, Mullit
Anzeige
AW: Doch, aber keine Idee! o.T
15.01.2019 12:35:09
Excel2017
Hallo Mullit,
Danke dafür, dass Du doch noch eine Lösung bereitgestellt hast. Ich habe damit getestet, aber teilweise auch einen Abbruch bekommen.
In einer Loop versuche ich derzeit, verschiedene Informationen über diee Cells(1,1) herauszubekommen.
hier die debug.print, welche ich zusätzlich eingebaut habe:
SubCmd = RowHeight
RowHeight=15,75
SubCmd = ColumnWidth
ColumnWidth=3,14
SubCmd = Value
Value=Col
SubCmd = NumberFormat
NumberFormat=General
SubCmd = font.Bold
font.Bold=Wahr
SubCmd = font.underline
font.underline=2
SubCmd = font.Italic
font.Italic=Wahr
SubCmd = interior.Color
interior.Color=65535
SubCmd = Interior.ColorIndex
Interior.ColorIndex=6
SubCmd = Borders(xlDiagonalDown).LineStyle
Beim Command (Borders(xx)) bricht Deine Routine ab. Das habe ich jetzt mit "on Error goto Fehler" abgefangen und liefere eine entsprechende Fehlermeldung zurück.
Hast Du eine Idee?
Gruß
Werner
Anzeige
Danke Mullit, aber es gibt noch Probleme
16.01.2019 17:19:57
Excel2017
Sorry,
vermutlich hatte ich den kleinen Haken am Kontrollkästchen vergessen.
Bitte meinen letzten Update beachten.
Gruß
Werner
AW: Danke Mullit, aber es gibt noch Probleme
16.01.2019 21:07:15
Mullit
Hallo,
ja hatte ich schon ges., war aber zeitlich eingespannt; das mußt Du natürlich noch auf Deine Bedürfnisse anpassen, die Range-Klasse enthält ja unzählige Objekte und Methoden, der Code ist da nur ein Entwurf, mußt halt selbst weiterproggen ;-).
Aber bei den von Dir aufgezählten Eigensch. ist die Borders-Eig. die einzige, die einen Fehler wirft und das liegt an ihrem Parameter, das müsstest Du ebenfalls in der Function abfangen, mal ein Bsp. ...
Option Explicit

Public Sub test()
Dim avntArray() As Variant
Dim strSubCmd As String, strText As String
Dim ialngIndex As Long
avntArray = Array("RowHeight", "ColumnWidth", "Value", "NumberFormat", _
 "font.bold", "font.underline", "font.italic", "font.color", _
 "font.name", "Interior.Color", "Interior.ColorIndex", _
 "Borders(xlDiagonalDown).LineStyle")
 For ialngIndex = 0 To Ubound(avntArray)
     strSubCmd = avntArray(ialngIndex)
     strText = strText & avntArray(ialngIndex) & ":  " & _
     fncCallByName_SubCmd(Cells(1, 1), strSubCmd, VbGet) & vbCr
 Next
Call MsgBox(strText)
End Sub

Private Function fncCallByName_SubCmd(ByRef probjObject As Object, _
   ByVal pvstrProcName As String, ByVal pvenmCallType As VbCallType) As Variant
  Dim objReturn As Object
  Dim lngPos As Long, lngPos2 As Long, lngIndex As Long
  lngPos = InStr(pvstrProcName, ".")
  lngPos2 = InStr(pvstrProcName, "(")
  If lngPos = 0 Then
    If Not IsObject(CallByName(probjObject, pvstrProcName, pvenmCallType)) Then _
      fncCallByName_SubCmd = CallByName(probjObject, pvstrProcName, pvenmCallType)
  ElseIf lngPos2 <> 0 Then
     lngIndex = fncStringToEnum(Mid$(String:=pvstrProcName, Start:=lngPos2 + 1, _
      Length:=InStr(pvstrProcName, ")") - lngPos2 - 1))
     If lngIndex <> 0 Then
       Set objReturn = CallByName(probjObject, _
         Mid$(String:=pvstrProcName, Start:=1, Length:=lngPos2 - 1), _
         pvenmCallType, lngIndex)
     End If
  Else
     Set objReturn = CallByName(probjObject, _
        Mid$(String:=pvstrProcName, Start:=1, Length:=lngPos - 1), pvenmCallType)
  End If
  If Not objReturn Is Nothing Then
    pvstrProcName = Mid$(String:=pvstrProcName, Start:=lngPos + 1)
    fncCallByName_SubCmd = CallByName(objReturn, pvstrProcName, pvenmCallType)
    Set objReturn = Nothing
  End If
End Function

Private Function fncStringToEnum(ByVal pvstrXlBordersIndex As String) As XlBordersIndex
 Select Case pvstrXlBordersIndex
    Case Is = "xlDiagonalDown": fncStringToEnum = xlDiagonalDown
    Case Is = "xlDiagonalUp": fncStringToEnum = xlDiagonalUp
    Case Is = "xlEdgeBottom": fncStringToEnum = xlEdgeBottom
    Case Is = "xlEdgeLeft": fncStringToEnum = xlEdgeLeft
    Case Is = "xlEdgeRight": fncStringToEnum = xlEdgeRight
    Case Is = "xlEdgeTop": fncStringToEnum = xlEdgeTop
    Case Is = "xlInsideHorizontal": fncStringToEnum = xlInsideHorizontal
    Case Is = "xlInsideVertical": fncStringToEnum = xlInsideVertical
 End Select
End Function


VBA/HTML - CodeConverter für Office-Foren
AddIn für Excel/Word 2000-2010 - komplett in VBA geschrieben von Lukas Mosimann
Projektbetreuung durch mumpel



Code erstellt und getestet in Office 14

Gruß, Mullit
Anzeige
Danke Mullit
17.01.2019 11:33:37
Excel2017
Hallo Mullit,
danke für Dein erweitertes Beispiel.
Mit ist zwar aufgefallen, dass ich an der ersten abgefragten Eigenschaft gescheitert bin, in deren Namen ein (xxx)-Zusatz vorkam.
Nachdem ich jetzt eine funktionierende Lösung für Borders(xxxx).LineStyle habe, kann ich auch die Logik nachvollziehen und begreife inzwischen (mit meinem Basis-Wissen), was in Deiner Routine abläuft.
In der Hoffnung, bei weiteren Eigenschaften jetzt eine eigene Lösung hinzubekommen, betrachte ich diesen Thread als erledigt.
Gruß
Werner

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige