• 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.

Specifiek blad opslaan

Status
Niet open voor verdere reacties.

Judithdoek

Gebruiker
Lid geworden
9 mrt 2021
Berichten
70
Hallo,

Bijgevoegd een bestand waarmee ik enkel het blad Formulier test2 wil opslaan, met de bestandsnaam die op blad invoerbestand test2 in cel L3 staat.

D.m.v. macro's opnemen heb ik geprobeerd de code naar mijn wens te genereren. Er gaat alleen iets mis in onderstaande code in de tekst die rood is gemaakt, waardoor het bestand niet opgeslagen kan worden.

Kan iemand mij helpen?

Code:
Option Explicit
Sub Gegevens_opslaan()
ReDim ar(1 To 1, 1 To 15)
  With Sheets("Invoerbestand test2")
   If .Cells(4, 2).Value = "" Then .Cells(4, 2).Value = 0
      ar(1, 1) = [Nummer]
      ar(1, 2) = [Naam]
      ar(1, 3) = [Naam1]
      ar(1, 4) = [Klant]
      ar(1, 5) = [Soort_afspraak]
      ar(1, 6) = [Contactpersoon]
      ar(1, 7) = [Klantnummer]
      ar(1, 8) = [Bedrag]
      ar(1, 9) = [Plaats]
      ar(1, 10) = [Groep]
      ar(1, 11) = [Percentage]
      ar(1, 12) = [Opmerking]
      ar(1, 13) = [Percentage2]
      ar(1, 14) = [Percentage3]
      ar(1, 15) = [Percentage4]
   .Cells(4, 2).Value = Year(Date) & "-" & Format(Int(Right(.Cells(4, 2).Value, 4)) + 1, "#0000")
  End With
  With Sheets("Overzicht afspraken test2")
    .Cells(.Rows.Count, 1).End(xlUp).Offset(1).Resize(, UBound(ar, 2)) = ar
  End With
End Sub
Sub Cellen_leegmaken()
Range("D4").ClearContents
Range("F4").ClearContents
Range("B7").ClearContents
Range("D7").ClearContents
Range("F7").ClearContents
Range("B10").ClearContents
Range("D10").ClearContents
Range("F10").ClearContents
Range("B13").ClearContents
Range("D13").ClearContents
Range("F13").ClearContents
Range("B16").ClearContents
Range("D16").ClearContents
Range("F16").ClearContents
End Sub
Sub cel_plakken_als_waarde()
Range("L3").Select
Application.CutCopyMode = False
Selection.Copy
Range("L4").Select
ActiveSheet.Paste
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
Range("L4").Select
End Sub

[COLOR="#FF0000"]Sub Specifiek_blad_opslaan()
Sheets("Formulier test2").Select
Range("A1:U258").Select 'Wat doe ik hier fout en hoe geef ik aan welk bereik ik moet selecteren?
Selection.Copy
Workbooks.Add
Application.WindowState = xlNormal
ActiveSheet.Paste
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
Sheets("Blad1").Select
Sheets("Blad1").Name = "VMC"
Application.CutCopyMode = False
ChDir "H:\04 Visual Basic\TEST"
ActiveWorkbook.SaveAs Filename:="H:\04 Visual Basic\TEST\test1.xlsx", _
    FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False 'bij test1 moeten de gegevens op blad invoerbestand test2 in cel L3 (of cel L4 die d.m.v. klikken op knop gegevens in L3 plakt als waarde in L4)
Windows("Specifiek blad opslaan").Activate
End Sub
[/COLOR]

Private Sub CommandButton1_Click()
    Call cel_plakken_als_waarde
    Call Gegevens_opslaan
    Call Cellen_leegmaken
    Call Specifiek_blad_opslaan
End Sub
 

Bijlagen

  • Specifiek blad opslaan.xlsm
    40,7 KB · Weergaven: 34
Begin eerst zelf alle overbodige 'selects' en 'activates' en 'clearcontents' te verwijderen.
Kom daarna terug.
 
Wat bedoel je precies? Deze zijn nodig voor de rest van het bestand. Het gaat erom dat de knop in de juiste volgorde werkt.
 
Het is namelijk uiteindelijk de bedoeling dat (bijv.) de cellen pas als laatste leeggemaakt worden. In formulier moet nog verwezen worden naar de cellen. De knop moet dus uiteindelijk eerst de gegevens in het blad formulier bewaren en opslaan als waarde in een andere map en pas als laatste uitvoering de cellen leegmaken, omdat er anders geen gegevens bewaard worden in een nieuw bestand.

Snap je?
 
Select en Activate zijn vrijwel nooit nodig.
Dat is iets wat de macrorecoder er van maakt, wat maar logisch is, vermits als je zelf met excel werkt, je wel het een en ander selecteert.

Een voorbeeld (komt uit jouw code)

Code:
Sheets("Blad1").Select
Sheets("Blad1").Name = "VMC"

Dit zou je kunnen vervangen door:

Code:
Sheets("Blad1").Name = "VMC"

En ook dat is dan nog een afschuwelijke code vermits als je dit werkblad van naam verandert, het de volgende keer toch nog fout loopt, want het werkblad bestaat dan gewoonweg niet meer onder die naam.

De raad die men je dus gaf moet je zeker 's toepassen. Knip je code in hele kleine stukjes (zoals ik hierboven deed), vereenvoudig dit nog wat, en zie wat het doet.
 
Bedankt! Ga ik doen! Denk je dat ik hierdoor ook mijn probleem oplos hoe automatisch een specifiek op te slaan?
 
Zo kopieer je een specifiek tabblad en sla je dat op

Code:
Sub j()
 With ActiveSheet
  .Copy
   ActiveSheet.SaveAs .Parent.Path & "\test2", 52
 End With
End Sub
 
De titel van het topic is wat verwarrend.
Ik denk dat TS eerder op zoek is naar zoiets.
 

Bijlagen

  • Specifiek blad.xlsm
    28,2 KB · Weergaven: 35
@Pagadder bedankt voor het delen. Mooie manier om gegevens in te laten voeren. Echter is de titel van dit topic precies wat ik wil. Ik wil namelijk alleen het blad formulier test2 opslaan in een andere map, iedere keer wanneer er gedrukt wordt op de knop moet er een nieuw bestand opgeslagen worden (het bestand moet dus niet worden overschreven).
 
@VenA Ja maar dat betekend dat ik de knop moet plaatsen in het blad zelf, echter wil ik de knop plaatsen in een ander blad
 
Is dit de opbouw van de bestandsnaam?:shocked:
PHP:
=CONCATENATE(B4;M3;N3;M3;B7;M3;N3;M3;D7;M3;N3;M3;TEXT(O3;"dd-mm-jjjj"))

Wat @snb in #2 bedoelt staat hier.
Code:
Sub cel_plakken_als_waarde()
  Range("L4") = Range("L3").Value
End Sub

Code:
Sub Cellen_leegmaken()
  Range("D4,B7,D7,F7,B10,D10,F10,B13,D13,F13,B16,D16,F16").ClearContents
End Sub
Kan nog wat korter maar je vindt het blijkbaar leuk om van alles te verstoppen met de voor- en achtergrondkleur hetzelfde.


Code:
Private Sub CommandButton1_Click()
    Call cel_plakken_als_waarde
    Call Gegevens_opslaan
    Call Cellen_leegmaken
    Call Specifiek_blad_opslaan
End Sub
Lijkt mij een ongelukkige volgorde waarbij Call overigens overbodig is.

Wil je nu een variabel bereik uit een variabele tab opslaan als nieuw bestand of een kopie van steeds dezelfde tab?
In het laatste geval
Code:
Sub Specifiek_blad_opslaan()
  Dim c00 As String
  Application.DisplayAlerts = False
  c00 = "E:\Temp\" & Sheets("Invoerbestand test2").Range("L3").Value & ".xlsx" 'pad wel even aanpassen.
  Sheets("Formulier test2").Copy
  With ActiveWorkbook
    .Sheets(1).Name = "VMC"
    .SaveAs c00, 51
    .Close True
  End With
End Sub
 
Hoi VenA, bedankt voor je reactie. Reactie #2 begrijp ik nu.
Kan nog wat korter maar je vindt het blijkbaar leuk om van alles te verstoppen met de voor- en achtergrondkleur hetzelfde.
Hoe bedoel je precies? Hoe kan ik het korter inregelen? En wat bedoel je met "van alles te verstoppen met de voor- en achtergrondkleur?"
Lijkt mij een ongelukkige volgorde waarbij Call overigens overbodig is.
Waarom is Call overbodig? En hoe moet ik de codes dan verwerken in de knop? Voor mij is het nu makkelijk, omdat ik wat specifieker kan zoeken wat de code doet. Ik kan dat natuurlijk ook met ' aangeven, maar dit vind ik overzichtelijker.
Wil je nu een variabel bereik uit een variabele tab opslaan als nieuw bestand of een kopie van steeds dezelfde tab?
Ik wil de gegevens in hetzelfde bereik iedere keer als het ware vernieuwen, maar de gegevens moeten wel worden opgeslagen voordat er vernieuwd wordt, snap je wat ik bedoel? Ik begrijp jouw vraag namelijk niet helemaal, excuus.
 
Je hebt er een mooie oranje kleurplaat van gemaakt maar in sommige cellen staat een formule. Deze zijn voor de helpers op het eerst oog niet zichtbaar.
Call is overbodig omdat je een procedure direct kan aanroepen.
Je moet eerst gegevens opslaan voordat je ze gaat wissen. Klinkt best logisch toch?

Code:
Private Sub CommandButton1_Click()
  cel_plakken_als_waarde
  Gegevens_opslaan
  Specifiek_blad_opslaan
  Cellen_leegmaken
End Sub
 
@VenA klopt inderdaad van die cellen leegmaken.

Oranje kleurplaat is, omdat het een gebruiksvriendelijk bestand wordt. Uiteindelijk worden de meeste cellen (zoals die cel met formule) beveiligd. Ik heb de tekst zelfde kleur als achtergrond gemaakt, omdat ik het een beetje ******proof wil maken.

Thanks voor de tip over Call, waar kan ik call dan wel voor gebruiken?
 
Gebruiksvriendelijk en monkeyproof wordt het met de suggestie van @Pagadder in #8. (los van het spuuglelijke oranje)

Call kan je gebruiken om te bellen.
 
@Pagadder heeft een mooi bestand gemaakt, echter heb ik geen tijd gehad een ander bestand te creëren. Ik focus mij graag eerst op het leren van codes.

"(los van het spuuglelijke oranje)" dat is jouw mening en daar wordt weinig mee gedaan.

Ik ben hier om te leren, als je mij geen dingen wil leren en op een sarcastische toon reageert, waarom reageer je dan? Call dient duidelijk ergens voor in VBA, mijn vraag is waarvoor, als je daar geen antwoord op weet of geen antwoord op wil geven, zeg dat dan.
 

Bijlagen

  • Schermafbeelding 2021-04-23 101455.png
    Schermafbeelding 2021-04-23 101455.png
    18,1 KB · Weergaven: 44
@Cow18 Voor de tips ben ik dankbaar en ben ik blij met dit forum. @VenA verteld mij dat "Call" overbodig is, ik vraag mij dan af waar het wel voor dient. Lijkt me geen rare vraag om te stellen, wanneer iemand zegt dat het overbodig is. De wijze waarop jij reageert is normaal en is duidelijk, echter de reactie van @VenA die daarop volgde heb ik niks aan en daar komen we niet verder mee.

Daarnaast zijn er mensen (die via google) terecht komen op dit forum en ook meelezen in deze vraag, wanneer zij tegen een probleem aanlopen. De reactie #16 die @VenA plaatst is niet effectief voor dit forum, omdat niemand er iets mee kan.

Vandaar mijn reactie.
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan