• Privacywetgeving
    Het is bij Helpmij.nl niet toegestaan om persoonsgegevens in een voorbeeld te plaatsen. Alle voorbeelden die persoonsgegevens bevatten zullen zonder opgaaf van reden verwijderd worden. In de vraag zal specifiek vermeld moeten worden dat het om fictieve namen gaat.

foutmelding sbestandsnaam

Status
Niet open voor verdere reacties.

wim1985

Gebruiker
Lid geworden
1 aug 2008
Berichten
94
Ik heb een vba code gemaakt voor heb kopieren van data naar een ander exel bestand.
Dit gaat prima. Echter het bestand waar het heengeschreven moet worden is een flexibele bestandnaam en de naam staat in K1
Hij opent het bestand goed maar ik moet tussen kopieren en plakken van de data switchen tussen Werkorders.xls en de sBestandsnaam. Dit lukt me niet. Ik heb een klein stukje van de code toegevoegd.

Wat doe ik fout??

[Sheets("werkorder").Select

Dim sBestandsnaam As String

Application.ScreenUpdating = False

With ActiveSheet
sBestandsnaam = .Range("K1").Value
.Copy
End With

Workbooks.Open Filename:= _
"\\Dirkjan\shareddocs\Urenregistratiesysteem\nacalculaties\" & sBestandsnaam

Windows("Werkorders.xls").Activate
Sheets("printblad").Select
Range("K1").Select
Selection.Copy
Windows("sBestandsnaam.xls").Activate
Range("A250").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Windows("Werkorders.xls").Activate
Range("C5").Select
Application.CutCopyMode = False]
 
wim1985

Eerst even 2 opmerkingen.

Kan je juiste code tags toevoegen aan de code? Voor de code tags:

Eerst dit typen:
Code:
dan plak je jouw code
dan typ je: [/code ] zonder spatie


Dan, kijk eens eerst naar jouw gestelde vragen op het forum: http://www.helpmij.nl/forum/search.php?searchid=2271702: vrij veel topics die niet opgelost zijn en waar jij niet de laatste poster bent. Dat "nodigt niet echt uit" tot posten in jouw topics.


Ten slotte over de vraag:

declareer een variabele als workbook. Dus [CODE]dim wbBestand As Workbook
Hier heb ik zoiets al in een voorbeeld gezet: http://www.helpmij.nl/forum/showpost.php?p=2559384&postcount=3

Wigi
 
Wigi,

Excusses voor het ongemak. Die codetags werden al vaker genoemd, maar niemand gaf aan hoe het dan moest. Nu is het duidelijk. Ik zal de geposte zaken eens bijlangs want bijna alles is uiteindelijk wel opgelost.

Ik ben nu al een paar dagen weer met vba bezig en moet zeggen dat het steeds beter gaat. Ik snap echter niets van de code in je voorbeeld. Zou je mijn stukje code willen aanpassen zoals jij denkt dat het moet zijn, misschien begrijp ik dan wat je bedoeld.

Alvast bedankt
 
Voilà, duidelijker en simpeler kan ik het echt niet uitleggen.

Code:
Sub databasing()

    'maak een variabele aan waar we tekst in gaan zetten
    Dim sDatabasename As String
    
    'declareer een variable (reserveer een stukje in het geheugen van de PC) waar we een referentie bijhouden naar een bepaald bestand
    'dat bestand zal het doelbestand worden
    Dim wb As Workbook

    'stel de naam + locatie van het doelbestand op
    sDatabasename = "c:\mijn documenten\" & Sheets("Direct Mail tool").Range("G17").Value & Format(Now(), "yy") & ".xls"

    'verkorte notatie: With neemt steeds terugkerende dingen apart
    With Workbooks("SPOT V3")
    
        'vanuit bestand SPOT V3 wordt er gekopieerd
        'wat wordt gekopieerd? start in cel A12 op blad "summary direct mail"
        'maak een blok van cellen rond die A12 tot aan de volgende lege kolom en lege rij (een rechthoekig bereik dus)
        'zonder mee te geven hoeveel cellen je kopieert, kan elke keer anders zijn als er bvb. meer of minder data is
        .Worksheets("summary direct mail").Range("A12").CurrentRegion.Copy
        
        'we proberen de variabele wb te vullen met een referentie naar het doelbestand
        'bestaat dat bestand niet op de harde schijf, dan treedt er een fout, een run-time error op
        'die vangen we op via 'On Error Resume Next' zodat de code er niet uit knalt
        'via Workbooks.Open wordt het doelbestand ook geopend, anders kunnen we er niet in plakken (simpel gezegd)
        'On Error GoTo 0 wil zeggen dat als er een fout opgetreden is (bestand bestaat niet bvb.) dan wissen we die fout uit het geheugen,
        'en doen we 'On Error Resume Next' weer teniet. Na de 'On Error GoTo 0' zal de code dus weer eruit knallen indien er een fout zou
        'optreden om welke reden dan ook
        On Error Resume Next
        Set wb = Workbooks.Open(Filename:=sDatabasename)
        On Error GoTo 0
        
        'ik ga nu na of de variabele wb gevuld kon worden: als wb 'nothing' is, dan kon wb niet gevuld worden met een referentie naar het
        'doelbestand en is er een fout opgetreden. In dat geval kan er niet verder gegaan worden.
        'als wb NIET nothing is, kon wb gevuld worden en is er dus een geldige referentie naar het doelbestand aanwezig.
        'wb kan dus nu dienen als een plaatsvervanger voor dat doelbestand.
        'bvb. wb.Worksheets.Count zal het aantal werkbladen binnen het doelbestand geven
        If Not wb Is Nothing Then
            
            'in het 'bestand' wb, op het blad genaamd "NAAMVANDESHEET" (zelf in te vullen), op cel A2, plakken we de gekopieerde data
            'als waarden
            wb.Sheets("NAAMVANDESHEET").Range("A2").PasteSpecial xlValues
            
            'het mierenspoor na kopiëren weghalen
            Application.CutCopyMode = False
            
            'we sluiten het doelbestand (Close) en slaan de wijzigingen op (SaveChanges:=True). Kijk in de helpfiles bij Close voor de
            'argumenten die je kan specifiëren bij een methode. Bij de Close methode is dat dus maar 1 argument, SaveChanges True of False,
            'wijzigingen opslaan of niet.
            wb.Close True
        
        End If
        
        'het bestand SPOT V3 wordt beveiligd. Kijk ook in de helpfiles voor de argumenten die je kan specifiëren bij Protect.
        .Protect Password:="pricing", Structure:=True, Windows:=True
        
        'we halen de variabele weer uit het geheugen, zodat die dus geen geheugen meer verbruikt. Dit is efficiënter.
        '2de reden is dat andere code dan niet per ongeluk dingen kan doen in dit bestand als er toevallig ook wb gebruikt wordt en die
        'wb niet deftig geïnitialiseerd wordt.
        Set wb = Nothing
    
    'het With statement nog afsluiten
    End With
    
End Sub

Wigi
 
Wigi,

Met je uitleg kom ik heel ver. Heb de code nu aangemaakt en zal hem vandaag op het netwerk testen. Ik laat het je nog weten
 
Wigi,

Ik moet nogal wat verschillende cellen naar verschillende locaties kopieeren. Ik had dacht ik een goede combinatie gevonden met jouw code erin maar hij loopt direct al stop op With Workbooks("Werkorders") en misschien daarna nog wel op meer. Blijkbaar klopt mij bedenksel toch niet helemaal.

De cel k1 in de sDatabasename staat op sheet werkorder

printblad en werkorder zijn sheets van werkorders.xls

Zou je de moeite willen nemen er naar te kijken.

Alvast bedankt
Wim



Code:
Sub Macro3()
'
' Macro3 Macro
' De macro is opgenomen op 2-1-2009 door A.Otten.
'

'
    Sheets("werkorder").Select

    Dim sDatabasename As String

    Dim wb As Workbook
    
    sDatabasename = "\\Dirkjan\shareddocs\Urenregistratiesysteem\nacalculaties\" & Sheets("Materiaal").Range("K1").Value & ".xls"
    
    With Workbooks("Werkorders")
    
    Set wb = Workbooks.Open(Filename:=sDatabasename)
    
    .Worksheets("werkorder").Range("K1").Value = wb.Sheets("Materiaal").Range("A250").Value
    .Worksheets("printblad").Range("C5").Value = wb.Sheets("Materiaal").Range("B250").Value
    .Worksheets("printblad").Range("C6").Value = wb.Sheets("Materiaal").Range("C250").Value
    .Worksheets("printblad").Range("C10").Value = wb.Sheets("Materiaal").Range("D250").Value
    .Worksheets("printblad").Range("C13").Value = wb.Sheets("Materiaal").Range("E250").Value
    .Worksheets("printblad").Range("C14").Value = wb.Sheets("Materiaal").Range("F250").Value
    .Worksheets("printblad").Range("C20").Value = wb.Sheets("Materiaal").Range("G250").Value
    .Worksheets("printblad").Range("C8").Value = wb.Sheets("Materiaal").Range("H250").Value
    .Worksheets("printblad").Range("C9").Value = wb.Sheets("Materiaal").Range("I250").Value
    .Worksheets("printblad").Range("E14").Value = wb.Sheets("Materiaal").Range("J250").Value
    
    Application.CutCopyMode = False
    
    wb.Sheets("Materiaal").Activate
    Range("A2:J251").Select
    Selection.Sort Key1:=Range("F2"), Order1:=xlAscending, Key2:=Range("C2") _
        , Order2:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:= _
        False, Orientation:=xlTopToBottom, DataOption1:=xlSortNormal, DataOption2 _
        :=xlSortNormal
    Range("A1").Select
    
    wb.Close True
            
    End With
    
    Worksheets("werkorder").Select

End Sub
 
Is dat Werkorders bestand geopend? In dezelfde Excel applicatie?

Probeer evt. ook: With Workbooks("Werkorders.xls")
 
Dat is nu opgelost zoals je schreef, hij hangt nu op de regel eronder

Set wb = Workbooks.Open(Filename:=sDatabasename)

in K1 (staat in het reeds geopende bestand werkorders.xls op sheet werkorder) staat momenteel 4ec1015 39817 en hij zou dan moeten openen het bestand \\Dirkjan\shareddocs\Urenregistratiesysteem\nacalculaties\4ec1015 39817.xls toch?
Het bestand bestaat daar en is niet geopend

gr Wim
 
Wigi,

Ik dacht dat ik met deze regel de sheet "materiaal" opende in het bestand "\\Dirkjan\shareddocs\Urenregistratiesysteem\nacalculaties\4ec1015 39817.xls"
Dit moet dan de sheet zijn waar de data heen geschreven wordt.

K1 in de regel hieronder wijst dan volgens jou niet naar het bestand "werkorders.xls sheet werkorder" ?


sDatabasename = "\\Dirkjan\shareddocs\Urenregistratiesysteem\nacalculaties\" & Sheets("Materiaal").Range("K1").Value & ".xls"

gr Wim
 
K1 in de regel hieronder wijst dan volgens jou niet naar het bestand "werkorders.xls sheet werkorder" ?

sDatabasename = "\\Dirkjan\shareddocs\Urenregistratiesysteem\nacalculaties\" & Sheets("Materiaal").Range("K1").Value & ".xls"

Inderdaad, cel K1 op het blad Materiaal.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan