Controleren van een variabele in een lijst

Status
Niet open voor verdere reacties.

ColdDeath

Gebruiker
Lid geworden
7 nov 2013
Berichten
63
Hallo,

Ik probeer een automatische projectnummer aan te maken via VBA. Ik heb het volgende:

Code:
Private Sub knop_Click()
    If ListBox1.ListIndex = -1 Then Exit Sub
    c00 = "Z:\PROJECTEN\" & Listbox1.Value & "\DOCUMENTEN\*.sldprt"
    ListBox2.List = Filter(Split(CreateObject("wscript.shell").exec("cmd /c Dir """ & c00 & """ /b/o").stdout.readall, vbCrLf), ".sldprt")
End Sub

De lijst die hier wordt geprint wil ik controleren op een bepaald projectnr. als het bestaat, dan krijgt het een groter nummer toegekend totdat er een nummer is dat niet in de lijst staat:

Code:
Dim i As Integer

Do While i < 99
    If i = 0 Then
        i = i + 1
    End If

Dim lengtenr As Integer

    If i < 10 Then
        lengtenr = 8
    Else
        lengtenr = 9
    End If
    partnr = Mid(projectnr, 1, Len(projectnr) - lengtenr) & i & ".sldprt"
    'Een code dat controleert of partnr in de lijst staat die aangemaakt is door bovenstaande code.
        i = i + 1
    End If
Loop

Het nummer wat ik heb aangemaakt wil ik controleren of het in de folder staat. Alleen weet ik niet hoe ik dat moet doen. Kan iemand mij hierbij helpen?


Met vriendelijke groet,
Willie
 
Ik heb zelf geprobeerd om "mijnLijst" in te stellen als:
Code:
 Dim mijnLijst
Vervolgens te zeggen dat:
Code:
mijnLijst = Filter(Split(CreateObject("wscript.shell").exec("cmd /c Dir """ & c00 & """ /b/o").stdout.readall, vbCrLf), ".sldprt")
Daardoor wordt mijnLijst een lijst en dat te doorzoeken door middel van:
Code:
If mijnlijst.Exists(partnr) then

Ik heb toevallig dat op google gevonden, maar het werkt niet. Bij het typen en het wijzigen van ".Exists" doet vba geen automatische aanvullingen of iets dergelijks. Echt blijft VBA op me vitten dat het probleem bij mijnLijst is.

Ik denk dat ik mijnLijst moet instellen als een array: mijnLijst(x) maar ik weet niet hoeveel variabelen in de lijst staan. Het kan iedere keer anders zijn....

Ik heb het gevoel dat het antwoord moeilijker is dan de vraag die ik stel.


Met vriendelijke groet,
Willie
 
Laatst bewerkt:
Ik heb geprobeert om een custom function te gebruiken in VBA maar dat lukt ook niet.

Code:
Dim swApp As Object
Sub main()
Set swApp = Application.SldWorks
Dim i As Integer
Dim lijst() As Variant
Dim txt As String
Dim c01 As String
Dim partnr As String
partnr = "A1-00"&i
lijst = Array("A1-001", "A1-002", "A1-003", "A1-004", "A1-005")

Do While i < 9
    If i = 0 Then
        i = i + 1
    End If
    If Not IsInArray(partnr, lijst) = True Then
        Exit Do
    End If
i = i + 1
Loop
MsgBox ("Projectnummer = " & partnr)

End Sub

Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean
  IsInArray = Not IsError(Application.Match(stringToBeFound, arr, 0))
End Function

VBA zegt als ik dit probeer te runnen:

Code:
Run-time error '438':

Object doesn't support this property or method

Als ik op Debug klik dan wordt de volgende regel gemarkeerd:

Code:
  IsInArray = Not IsError(Application.Match(stringToBeFound, arr, 0))

Wat doe ik verkeerd?


Met vriendelijke groet,
Willie
 
Laatst bewerkt:
Welke waarden komen er bijvoorbeeld in listbox2 te staan ?
 
Voorbeeld lijst:
A1-014-110-01.SLDPRT
A1-014-110-02.sldprt
A1-014-110-03.sldprt
A1-014-110-04.SLDPRT
A1-014-110-11.SLDPRT
A1-014-110-12.SLDPRT
A1-014-120-01.sldprt
A1-014-125-01.SLDPRT
A1-014-125-05.SLDPRT
Etc.

Format
[A1]-[014]-[110]-[01]
[Projectnummer]-[Jaartal]-[Assembly nummer]-[Partnummer]

Het switchen van hoofdletters en kleine letters is bewust gedaan. Sommige bestanden zijn opgeslagen met kleine letter, sommige met hoofdletters.


Met vriendelijke groet,
Willie
 
Laatst bewerkt:
SVP niet citeren.

En waarnaar ben je dan op zoek ?
 
Door middel van:

Code:
ListBox2.List = Filter(Split(CreateObject("wscript.shell").exec("cmd /c Dir """ & c00 & """ /b/o").stdout.readall, vbCrLf), ".sldprt")

Genereert de macro een lijst met .sldprt, die in de folder 'c00' staan. Ik heb vooraf aangegeven welk [Projectnummer], [Datum] en [AssemblyNummer] mijn variabele "partnr" krijgt. Door middel van

Code:
 do while i < 99

Wil ik op alfabetische volgorde een [Partnummer] toekennen aan mijn variabele, maar de variabele mag niet voorkomen in de lijst die mijn macro zojuist heeft gegenereerd.

Ik wil dat de macro mijn variabele vergelijkt met iedere naam in de listbox. Als de exacte* naam niet voorkomt in de lijst, dan wil ik uit de 'Do While'.

In andere woorden, als "A1-014-110-01.SLDPRT" en "A1-014-110-03.sldprt" in mijn folder staan, wil ik dat partnr "A1-014-110-02.SLDPRT" toegekend wordt.

Ik hoop je hiermee voldoende te hebben geïnformeerd.


Met vriendelijke groeten,
Willie Roelofs


* = Met uitzondering van hoofdletters
 
Laatst bewerkt:
Code:
Sub M_snb()
  MsgBox UBound(Filter(Application.Transpose(ListBox1.List), "aa"))
End Sub
 
Kan het zijn dat ik een bepaalde library in mijn VBA code moet stoppen? Zo ja, hoe doe ik dat?

Ik heb geprobeerd om libraries toe te voegen dmv Tools -> References en dan de library. Vervolgens mijn module te beginnen met bijvoorbeeld:
Code:
Imports System.IO

Of welke library dan ook. Maar schijnbaar kent VBA de code Imports niet? Ik krijg dan de melding:

Code:
Compile error:

Invalid outside procedure

Als ik hem verplaats onder Sub main()

Code:
Compile error:

Sub or Function not defined

Wat doe ik verkeerd?


Met vriendelijke groeten,
Willie Roelofs
 
Super bedankt voor jullie hulp! Ik heb het als volgt opgelost:

Een groot probleem was dat ik niet wist waar ik de Function moest plaatsen. Nu wel. Daarbij heb ik (zelf snb ;) ) de code geschreven om de waarde te vinden.

Code:
Public Function IsInArray(arr As Variant, valueToFind As Variant) As Boolean
  IsInArray = (UBound(Filter(arr, valueToFind, True, vbBinaryCompare)) > -1)
End Function


Sub main()
Set swApp = Application.SldWorks

Dim c00 As String
Dim MyArray() As String
Dim j As Integer
Dim partnr As String
Dim variabele As String
c00 = "X:\PROJECTEN\A1-014\04 - SOLIDWORKS\*.sldprt"


MyArray = Split(CreateObject("wscript.shell").exec("cmd /c Dir """ & c00 & """ /b/o").stdout.readall, vbCrLf)

For j = LBound(MyArray) To UBound(MyArray)
    If j = 0 Then j = j + 1
    variabele = "A1-014-110-0" & j
    If IsInArray(MyArray, variabele) = False Then Exit For
Next j

Debug.Print variabele

End Sub
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan