Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

Excel VBA Variable
#1
Hallo Zusammen, 
ich habe folgenden Code gefunden und kopiert und dieser funktioniert auch. 
Allerdings möchte ich die Zahl 1001 im Code variabel halten, sprich ich möchte auf meinem Excel Worksheet
in einer Zelle eine Zahl eingeben z.B. 1002 und dadurch wird überall wo jetzt im Code 1001 steht eine 1002.
Ich habe dafür eine neue Variable erstellt die den Wert der Zelle annimmt aber wenn ich dann zB
Dim arr_107_neueVariable() schreibe funktioniert das nicht.

Ich bin leider ein Excel VBA Amateur...

Code:
Public Sub readDesignresults()
Dim Filename As String
Dim Index, datalen As Long
Dim row, pos As Long
Dim arr_107_1001() As Variant
ReDim arr_107_1001(40, 0)
Dim Destination1 As Range

    'Lets clear the sheet first
    tab1.Cells.Clear
   
    'The path of the file
    Filename = tab1.TextBox1.Text
   

    'To connect to the CDB we will use
    Index = sof_cdb_init(Filename, 99)
     
    'Get the data from CDB
    Dim data As CBEAM_DE0
    datalen = Len(data)
   
    Do While sof_cdb_get(Index, 107, 1001, data, datalen, pos) = 0
        row = row + 1
        pos = pos + 1
       
        'Redim the array for the output
        ReDim Preserve arr_107_1001(40, row)
       
        'Copy the values to array
        arr_107_1001(0, row) = data.m_NR
        arr_107_1001(1, row) = data.m_X
        arr_107_1001(2, row) = data.m_NI
        arr_107_1001(3, row) = data.m_MYI
        arr_107_1001(4, row) = data.m_MZI
        arr_107_1001(5, row) = data.m_SCF
        arr_107_1001(6, row) = data.m_E0
        arr_107_1001(7, row) = data.m_EY
        arr_107_1001(8, row) = data.m_EZ
        arr_107_1001(9, row) = data.m_E1
        arr_107_1001(10, row) = data.m_E2
        arr_107_1001(11, row) = data.m_HL
        arr_107_1001(12, row) = data.m_HVM
        arr_107_1001(13, row) = data.m_HX
        arr_107_1001(14, row) = data.m_EDCMIN
        arr_107_1001(15, row) = data.m_EDCMAX
        arr_107_1001(16, row) = data.m_FCHK
        arr_107_1001(17, row) = data.m_TCF
        arr_107_1001(18, row) = data.m_SCN
        arr_107_1001(19, row) = data.m_SCVY
        arr_107_1001(20, row) = data.m_SCVZ
        arr_107_1001(21, row) = data.m_SCMT
        arr_107_1001(22, row) = data.m_SCMY
        arr_107_1001(23, row) = data.m_SCMZ
        arr_107_1001(24, row) = data.m_SCMB
        arr_107_1001(25, row) = data.m_SCT2
        arr_107_1001(26, row) = data.m_SCCOMB
        arr_107_1001(27, row) = data.m_SCBN
        arr_107_1001(28, row) = data.m_CSIGC
        arr_107_1001(29, row) = data.m_CSIGT
        arr_107_1001(30, row) = data.m_CTAU
        arr_107_1001(31, row) = data.m_CSGV
        arr_107_1001(32, row) = data.m_CSGR
        arr_107_1001(33, row) = data.m_CAS
        arr_107_1001(34, row) = data.m_CASL
        arr_107_1001(35, row) = data.m_CCW
        arr_107_1001(36, row) = data.m_CSGD
        arr_107_1001(37, row) = data.m_CTAU0
        arr_107_1001(38, row) = data.m_C2T
        arr_107_1001(39, row) = data.m_CLASS
       
        'Get the length of the data. This is very important!!!
        datalen = Len(data)
    Loop
   
    'Set the names of header row and columns
      arr_107_1001(0, 0) = "Stabnummer"
      arr_107_1001(1, 0) = "Abstand zum Stabanfang"
      arr_107_1001(2, 0) = "Normalkraft"
      arr_107_1001(3, 0) = "Biegemoment um Y-Achse"
      arr_107_1001(4, 0) = "MZI"
      arr_107_1001(5, 0) = "SCF"
      arr_107_1001(6, 0) = "Dehnung im Schwerpunkt"
      arr_107_1001(7, 0) = "EY"
      arr_107_1001(8, 0) = "EZ"
      arr_107_1001(9, 0) = "Druckdehnung"
      arr_107_1001(10, 0) = "Zugdehnung"
      arr_107_1001(11, 0) = "Hebelarm innerer Kräfte"
      arr_107_1001(12, 0) = "Versatzmaß"
      arr_107_1001(13, 0) = "Druckzonenhöhe"
      arr_107_1001(14, 0) = "EDCMIN"
      arr_107_1001(15, 0) = "EDCMAX"
      arr_107_1001(16, 0) = "FCHK"
      arr_107_1001(17, 0) = "TCF"
      arr_107_1001(18, 0) = "SCN"
      arr_107_1001(19, 0) = "SCVY"
      arr_107_1001(20, 0) = "SCVZ"
      arr_107_1001(21, 0) = "SCMT"
      arr_107_1001(22, 0) = "SCMY"
      arr_107_1001(23, 0) = "SCMZ"
      arr_107_1001(24, 0) = "SCMB"
      arr_107_1001(25, 0) = "SCT2"
      arr_107_1001(26, 0) = "SCCOMB"
      arr_107_1001(27, 0) = "SCBN"
      arr_107_1001(28, 0) = "CSIGC"
      arr_107_1001(29, 0) = "CSIGT"
      arr_107_1001(30, 0) = "CTAU"
      arr_107_1001(31, 0) = "CSGV"
      arr_107_1001(32, 0) = "CSGR"
      arr_107_1001(33, 0) = "CAS"
      arr_107_1001(34, 0) = "CASL"
      arr_107_1001(35, 0) = "CCW"
      arr_107_1001(36, 0) = "CSGD"
      arr_107_1001(37, 0) = "CTAU0"
      arr_107_1001(38, 0) = "C2T"
      arr_107_1001(39, 0) = "CLASS" 
   
    'Output the values to range
    Set Destination1 = tab1.Range("A4")
    Destination1.Resize(UBound(arr_107_1001, 2) + 1, UBound(arr_107_1001, 1) + 1).Value = Application.Transpose(arr_107_1001)
   
    'Center the output -> this is just for better looking
    tab1.Cells.HorizontalAlignment = xlCenter
   
    'Close the CDB
    Call sof_cdb_close(0)
   
Range("E1,F1,H1,I1,O:AN").EntireColumn.Delete
Range("A5").EntireRow.Delete

End Sub
Antworten Top
#2
Hi End Sub,

Du verwendest 1001 2 Mal. Einmal als Namensbestandteil des Arrays arr_107_1001() und einmal als Wertübergabe als Parameter für die Funktion sof_cdb... () in der  Bedingung für die While Schleife. Und nur da wäre es sinnvoll den Wert variabel zu gestalten. 

Statt 
Code:
Do While sof_cdb_get(Index, 107, 1001, data, datalen, pos) = 0
könntest Du 
Code:
Do While sof_cdb_get(Index, 107, Tabelle1.Cells(1,1).Value, data, datalen, pos) = 0
 schreiben. Also da die 1001 (als Wert) durch die Adresse ersetzen. Natürlich nur, wenn der Wert auch tatsächlich in Tabelle1 in Zelle A1 steht. Ansonsten müsstest Du das anpassen.

Den Namen des Arrays ändern zu wollen, bringt dagegen absolut nichts.

Wobei ich trotzdem nicht sagen kann, ob es das ist, was Du tatsächlich wolltest...
Der sicherste Ansatz für einen Irrtum ist der Glaube, alles im Griff zu haben.
Nur, weil ich den Recorder bedienen kann, macht mich das noch lange nicht zum Musiker.

Ciao, Ralf

Antworten Top
#3
(16.12.2022, 16:16)Ralf A schrieb: Du verwendest 1001 2 Mal.

Ich zähle 86 …  21

@TE:
Auch der VBE kennt Strg+h

Gruß Ralf
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
[-] Folgende(r) 1 Nutzer sagt Danke an RPP63 für diesen Beitrag:
  • Excel_Noob98
Antworten Top
#4
(16.12.2022, 16:27)RPP63 schrieb: Ich zähle 86 …  21 

...Du hast ja auch Akkupunktur und ich kann doch nicht bis 3 zählen...  26
Der sicherste Ansatz für einen Irrtum ist der Glaube, alles im Griff zu haben.
Nur, weil ich den Recorder bedienen kann, macht mich das noch lange nicht zum Musiker.

Ciao, Ralf

Antworten Top
#5
Information 
Wenn ich mich nicht verzählt hab sind es sogar 87  19
Die Zahl 1001 steht für einen Lastfall welcher auf ein Bauwerk wirkt und dafür ziehe ich aus einem Statikprogramm 40 Werte und mache weitere Berechnungen in der Exceldatei.
Es können aber viele verschiedene Lastfälle wirken, heißt die Zahl 1001 kann auch 1002, 1003 usw. sein. Dafür wollte ich auf dem Arbeitsblatt in eine Zelle die Lastfallnummer eingeben
und dann sollen automatisch die 40 Werte ausgefüllt werden. 

Das klappt auch, aber dafür muss man dann halt immer in dem Makro die Lastfallnummer ersetzen, das ist für einen Anwender nicht sehr praktikabel.


Den Namen des Arrays zu ändern ist da eigentlich unnötig, da hast du recht @Ralf A, aber wenn ich nur in der While Schleife die Änderung vornehme die du vorgeschlagen hast
wird wenn ich das Makro mit F8 einzeln durchgehe die While Schleife übersprungen und es springt direkt zu 
'Set the names of header row and columns
Antworten Top
#6
(19.12.2022, 08:52)Excel_Noob98 schrieb: ...wird wenn ich das Makro mit F8 einzeln durchgehe die While Schleife übersprungen und es springt direkt zu 
'Set the names of header row and columns

Dazu kann keiner was sagen, weil keiner die Funktion sof_cdb...() in der Bedingung der Schleife kennt. Wenn die Funktion bei 1002 halt 0 zurückliefert (und die Schleife ist kopfgesteuert), dann wird logischerweise der Code innerhalb der Schleife nie ausgeführt.

Vorschlag: Setze einen Haltepunkt vor die Schleife, ändere mal die Parameter und gehe im Einzelschrittmodus durch. Kontrolliere dabei alle Variablenwerte.
Setze die Bedingung ggf. an das Schleifenende, damit der Code im Schleifenrumpf wenigstens einmal ausgeführt wird.

Hänge mal eine Beispieldatei an, sonst wird das hier in eine Rateshow...

Hab gerade noch mal drüber geschaut... wozu die Schleife gut sein soll, ist mir ein Rätsel. Nicht ein einziger Parameterwert für die Funktion der Abbruchbedingung wird da geändert...  Huh
Der sicherste Ansatz für einen Irrtum ist der Glaube, alles im Griff zu haben.
Nur, weil ich den Recorder bedienen kann, macht mich das noch lange nicht zum Musiker.

Ciao, Ralf

Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste