Plaats alle .pdf bestanden van folder in listbox

Status
Niet open voor verdere reacties.

ColdDeath

Gebruiker
Lid geworden
7 nov 2013
Berichten
63
Hallo,

Ik ben op dit moment een macro aan het schrijven voor Solidworks.

Ik heb een userform met 2 listboxen.
o Standaardweergave
Listbox1 weergeeft alle projectnummers.
o Klik ik op "ok"
Dan moet de andere de "pdf" bestanden weergeven.
In de map zijn meerdere soorten bestanden maar ik wil alleen .pdf laten zien. (Het liefst als "document" en niet als "document.pdf", maar dat is een voorkeur)

In de code is te zien dat ik listbox1 gebruik voor de de folder te openen van het corresponderende projectnummer. En wordt doorgelinked naar de map waar de documenten staan.

Ik ben redelijk nieuw in het programmeren van VBA en ik heb geen idee hoe ik ".pdf" uit de lijst kan filteren. Sterker nog ik heb de code van google geplukt, ik heb enigszins een idee wat de code doet. Zou iemand mij kunnen helpen?

Code:
'Userform1
Private Sub Add_Click()
Dim objFSO2 As Object
Dim objFolder2 As Object
Dim objFile2 As Object
Dim i As Integer
Dim folderPath As String


For i = 0 To Listbox1.ListCount - 1
    If Listbox1.Selected(i) Then

    folderPath = "Z:\PROJECTEN\" & Listbox1.List(i) + "\DOCUMENTEN"
    Set objFSO2 = CreateObject("Scripting.FileSystemObject")
    Set objFolder2 = objFSO2.GetFolder(folderPath)

        For Each objFile2 In objFolder2.files

        ListBox2.AddItem objFile2.name

        Next objFile2
    End If
Next i
End Sub

Met vriendelijke groet,
Willie
 
Wijzig dit:
Code:
ListBox2.AddItem objFile2.name
Eens in dit:
Code:
If LCase(Right(objFile2.Name, 4)) = ".pdf" Then
    ListBox2.AddItem objFile2.Name
End If
 
Laatst bewerkt:
Vermijd aan userformcontrols gereserveerde (VBA) namen te geven; dus geen knop met de naam 'Add'.
Verwijder de eigenschap 'rowsource' of 'listfillrange' van iedere listbox/combobox voordat je een macro draait om de control te vullen..

Code:
Private Sub knop_Click()
    if listbox1.listindex=-1 then exit sub

    c00 = "Z:\PROJECTEN\" & Listbox1.value & "\DOCUMENTEN\*.pdf"
    listbox2.List =filter(split(createobject("wscript.shell").exec("cmd /c Dir """ & c00 & """ /b/s").stdout.readall,vbcrlf),".pdf")
End Sub
 
Laatst bewerkt:
Vermijd aan userformcontrols gereserveerde (VBA) namen te geven; dus geen knop met de naam 'Add'.
Verwijder de eigenschap 'rowsource' of 'listfillrange' van iedere listbox/combobox voordat je een macro draait om de control te vullen..

Code:
Private Sub knop_Click()
    if listbox1.listindex=-1 then exit sub

    c00 = "Z:\PROJECTEN\" & Listbox1.value & "\DOCUMENTEN\*.pdf"
    listbox2.List =filter(split(createobject("wscript.shell").exec("cmd /c Dir """ & c00 & """ /b/s").stdout.readall,vbcrlf),".pdf")
End Sub

1. Hartelijk bedankt voor de code.
2. Ik kan de code totaal niet volgen. Ik heb echt geen idee waar het allemaal voor staat.
3. Zoals ik al vermoedde laat VBA de code niet werken. Bij
Code:
c00

Compile error:

Variable not defined
 
Er staat vast Option Explicit bovenin je module. Maak er dan eens dit van:
Code:
Private Sub knop_Click()
    Dim c00 As String
    if listbox1.listindex=-1 then exit sub

    c00 = "Z:\PROJECTEN\" & Listbox1.value & "\DOCUMENTEN\*.pdf"
    listbox2.List =filter(split(createobject("wscript.shell").exec("cmd /c Dir """ & c00 & """ /b/s").stdout.readall,vbcrlf),".pdf")
End Sub
 
Nog eenvoudiger: verwijder 'Option Explicit'.
 
In kleine projectjes waar je niet echt omkijken hebt naar geheugengebruik kan dat ook inderdaad.
 
De manier van programmeren is veel bepalender voor snelheid dan wel/niet declareren van variabelen (waar je option explicit ook helemaal niet voor nodig hebt).
 
Wat ik maar bedoel is dat je verplicht bent de variabelen te declareren wanneer Option Explicit er in staat. Wat geheugengebruik betreft gaat het me niet om de snelheid maar de hoeveelheid. Zelf vind ik het altijd zonde om de standaard Variant te gebruiken als bijvoorbeeld een boolean of een byte voldoende is.

Voor kleine dingetjes zoals hierboven bedoeld hoeft dat inderdaad allemaal niet en kan Option Explicit er ook uit.
Het gebruik ervan is in de instellingen van Excel ook uit te schakelen.
 
Laatst bewerkt:
Hartelijk bedankt voor uw reacties! Macro's maken is een tijdje in de vrieskast gezet, vandaar mijn late reactie.

Ik wil graag volgens de manier werken zoals jullie voorstellen, echter laat VBA mij dit niet toe:

Code:
Private Sub UserForm_Initialize()
LisBox1.List = Filter(Split(CreateObject("wscript.shell").exec("cmd /c Dir ""Z:\PROJECTEN\"" /b /a-d").stdout.readall, vbCrLf), ".")
End Sub

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

Private Sub knop1_Click()
Dim myForm2 As UserForm2
Set myForm2 = New UserForm2
        UserForm2.teknrTB.Text = Listbox1.Value
        UserForm2.datumTB.Value = Format(Date, "dd-mm-yyyy")
        myForm2.Show
End Sub

Private Sub knop2_Click()
Dim Annuleren
Annuleren = MsgBox("Weet u zeker dat u wilt annuleren?", vbYesNo, "Let Op!")
If Annuleren = vbYes Then End
End Sub

Ik heb alle "option explicit" verwijdert.

Poging 1: Ik heb de knop_click gewijzigd in de aangereikte code. Toen ik op de knop drukte voor ListBox2 te vullen sloot de UserForm zichzelf af (ik weet niet of het een crash was?).
Poging 2: Ik heb alle listboxen gewijzigd zoals op snb-vba.eu staat aangegeven. Op het moment dat ik de userform wil starten dan krijg ik "Runtime error 424".
(ik heb windows 7 64bit versie misschien dat het er iets mee te maken heeft?)


Met vriendelijke groet,
Willie
 
Plaatsen van een bestand zou toch handiger zijn.

gebruik
Code:
Private Sub UserForm_Initialize()
   with CreateObject("wscript.shell")
      LisBox1.List = Split(.exec("cmd /c Dir ""Z:\PROJECTEN\"" /b /ad").stdout.readall, vbCrLf)
   end with
End Sub
 
Laatst bewerkt:
Update:

Ik heb option explicit terug erin gezet en c00 als variabele geset.
Code:
Option Explicit

Private Sub UserForm_Initialize()
Listbox1.List = Split(CreateObject("wscript.shell").exec("cmd /c Dir ""Z:\PROJECTEN\*."" /b /s").stdout.readall, vbCrLf)
End Sub

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

Private Sub knop1_Click()
Dim myForm2 As UserForm2
Set myForm2 = New UserForm2
        UserForm2.teknrTB.Text = Listbox1.Value
        UserForm2.datumTB.Value = Format(Date, "dd-mm-yyyy")
        myForm2.Show
End Sub

Private Sub knop2_Click()
Dim Annuleren
Annuleren = MsgBox("Weet u zeker dat u wilt annuleren?", vbYesNo, "Let Op!")
If Annuleren = vbYes Then End
End Sub

Ik krijg geen foutmelding meer. Cmd wordt opgestart als ik de macro activeer, vervolgens wordt de lijst gevuld met folders. Als ik een project heb geselecteerd en ik klik op de knop om listbox2 te vullen, dan sluit de userform zichzelf af. Waar zit ik ergens fout?


Groeten,
Willie Roelofs
 
Code:
Private Sub UserForm_Initialize()
   with CreateObject("wscript.shell")
      LisBox1.List = Split(.exec("cmd /c Dir ""Z:\PROJECTEN\"" /b /ad").stdout.readall, vbCrLf)
   end with
End Sub

Bedankt, de lijst wordt vele male sneller gevuld.

Echter als ik de listbox2 probeer te vullen dan zie ik voor een tiende van een seconde cmd, daarna sluiten cmd en de userform zichzelf af, de macro blijf daarentegen nog steeds actief.

Het probleem ligt waarschijnlijk bij:
Code:
ListBox2.List = Filter(Split(CreateObject("wscript.shell").exec("cmd /c Dir """ & c00 & """ /b/s").stdout.readall, vbCrLf), ".pdf")

Ik heb alleen geen flauw idee wat er gebeurt in de code.
 
Oké, ik heb de code in UserForm_Initialize() gekopieerd naar knop_Click()

Code:
Private Sub UserForm_Initialize()
   with CreateObject("wscript.shell")
      LisBox1.List = Split(.exec("cmd /c Dir ""Z:\PROJECTEN\"" /b /ad").stdout.readall, vbCrLf)
   end with
End Sub

Ik ben zeker dat bovenstaande code werkt, dus wil kijken wat er gebeurt als ik op de knop druk.

Userform sluit zichzelf alweer af! Conclusie: probleem ligt ergens anders.
 
Als je het userform start vanuit het werkblad (bijv. met een activeX-control) is er niets aan de hand.
Alleen als je hem vanuit de VBEditor start schiet ie terug naar de VBEditor (met Alt-F11 ook weer eenvoudig op te lossen).
 
Ja, klopt helemaal, hij doet het! Super bedankt!

Eén vraag, in Listbox1 krijg ik de foldernaam te zien, maar in listbox2 krijg ik naam+locatie te zien. Hoe filter ik de locatie eruit?


Met vriendelijke groet,
Willie
 
Door hem er niet in te zetten: controleer de code waarmee je listbox2 vult.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan