Clever-Excel-Forum

Normale Version: Excel VBA Variable
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
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
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...
(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
(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
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
(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