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

macro probleem

Status
Niet open voor verdere reacties.

lexcellern

Gebruiker
Lid geworden
15 okt 2015
Berichten
130
Ik heb 2 vragen:

Ik heb een macro waarbij het volgende (globaal) gebeurt:

Uitgangspositie is dat op tabblad X een aantal rijen zijn geselecteerd (die moet hij gaan kopiëren naar een tabblad Y die eerst leeggemaakt wordt).

De macro gaat eerst naar tabblad Y, maakt dit tabblad leeg, gaat terug naar tabblad X, kopieert de geselecteerde rijen, gaat weer naar tabblad Y waar hij ze plakt.
Hieronder de verkorte macro.

Vraag 1:
Ik wil echter niet meer dat het gehele tabblad Y leeggemaakt wordt, maar alleen de kolommen A t/m AT.
Hoe wordt de code dan?

Vraag 2:
Ik wil de macro uitbreiden. Aan het eind van de huidige macro moet tabblad Y worden opgeslagen als .CSV UTF 8 bestand onder een bepaalde naam (Z.CSV). Vervolgens moet worden teruggekeerd naar tabblad X en moet er worden gesaved.

Ik kan niet programmeren in/met VBA, ik maak momenteel alleen macro's door handelingen op te nemen, dus ik hoop dat iemand mij de volledige code kan geven.

Dit is de macro:

Sheets("Y").Select
Cells.Select
Selection.Delete Shift:=xlUp
Range("A2").Select
Sheets("X").Select
Selection.Copy
Sheets("Y").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Range("A1").Select
Sheets("X").Select
ActiveWorkbook.Save
Sheets("X").Select
End Sub
 
Oei, ik word nu kennelijk aangevallen en ik zou je reactie kunnen begrijpen als ik daadwerkelijk zo bot in elkaar zou steken, maar ik ben me werkelijk van geen kwaad bewust en ik zal alles even verduidelijken.

Allereerst heb ik het door jou genoemde topic beëindigd met een bedankje: "Dank voor alle hulp."
Sorry als dit onvoldoende (zichtbaar) was? Had ik dit anders moeten doen?

Dan het punt over geheugenverlies.
Daar zou ik best wel last van kunnen hebben, maar bij mijn weten niet v.w.b. dit onderwerp.
Ik borduur juist voort op het vorige, door jou genoemde topic en zit met een nieuw probleem.
Het vorige topic ging met name over het eerst leegmaken van een tabblad, waarna content uit een ander tabblad geplakt kan worden.

Ik heb dus nu wellicht een soortgelijk, maar toch net iets ander probleem.
De uitgangsfase is juist ongeveer de code die ik uit het vorige topic gebruik.

Wat is de nieuwe uitdaging?
Niet het gehele tabblad moet worden leeggemaakt, maar alleen een deel, sommige rijen moeten juist blijven staan.

Dus vraag 1:
Ik wil echter niet meer dat het gehele tabblad Y leeggemaakt wordt, maar alleen de kolommen A t/m AT.
Hoe wordt de code dan?

Vraag 2 is wellicht al eens behandeld maar gaat dus nu over een ander type save bestand, namelijk .csv UTF 8, waar ik nu problemen mee heb.

Ik heb dus niet het idee dat ik in herhalingen val, althans ben me daar niet van bewust, maar ik ben geen programmeur, heb nauwelijks kennis van vba en zit dus met een uitdaging die ik nu niet kan oplossen.
Ik kan hem in ieder geval niet halen uit een vorig topic (van mij).

Maar kennelijk heb iets verkeerd gedaan waardoor ik nu wordt aangevallen?
Of vloeit dit voort uit het grote verschil in kennis tussen een leek en een horourable Senior Member?
Ik sta voor alle kritiek open, wil me graag beteren, maar hoop dat je begrijpt dat ik me nu van geen kwaad bewust bent.
 
Je wordt helemaal niet aangevallen alleen gewezen op een aantal zaken die je niet doet. De code staat nog steeds niet tussen codetags. Ook heb je niets gedaan met de adviezen om geen gebruik te maken van Select. In #13 van het andere draadje staat een methode hoe je bepaalde rijen leeg kan maken zou zoiets niet om te buigen zijn naar kolommen?

Code:
Range("A:AK").ClearContents

Om op te slaan als csv UTF 8 kan zo
Code:
ActiveWorkbook.SaveAs "E:\Temp\Book1.csv", xlCSVUTF8
 
Ja, dat Range("A:AT").ClearContents kan inderdaad werken, dank voor die tip.

Een tijdje aan het ploeteren geweest, maar het gaat nog mis.
Voordat de macro begint zijn er rijen geselecteerd. Die rijen kopieert de macro dan naar het tabblad waar de rijen A:AT zijn leeggemaakt, maar hetgeen moet blijven staan in de cellen achter AT worden dan natuurlijk overschreven omdat de gehele rijen worden geplakt.
Het is niet de bedoeling dat ik telkens vooraf cellen A: AT selecteer. De gehele rij selecteren werkt veel makkelijker/sneller. Maar de macro moet dan wel alleen range A:At plaken. Met welke code kan dit?

Misschien denk ik nog veel te omslachtig en moet dit allemaal veel makkelijker kunnen.

Waar het op neer komt is dat het volgende moet gebeuren:

Een macro moet ervoor zorgen dat bepaalde cellen uit geselecteerde rijen gekopieerd worden naar een ander tabblad (Note: In dit tabblad staan in bepaalde kolommen al gegevens die niet gewijzigd moeten worden).
Daar moet hij ze in bepaalde cellen neerzetten.
Vervolgens moet dit tabblad opgeslagen worden als .CSV UTF8 bestand en moet er weer worden teruggegaan naar het oorspronkelijke tabblad (waaruit gegevens zijn gekopieerd).

Voorbeeld (sterk vereenvoudigd):

Uit tabblad X moet uit vooraf geselecteerde rijen de volgende cellen gekopieerd worden: cel kolom B, cel kolom D, cel kolom F
Deze moeten geplakt worden in tabblad Y als volgt (rij 1 van tabblad Y heeft gegevens die niet gewijzigd moeten worden):
(alle cellen van de geselecteerde rijen moeten dan uiteraard opeenvolgende vanaf rij 2 worden geplakt)
vanaf rij 2 dus:
cel kolom B moet in cel kolom A
cel kolom D moet in cel kolom B
cel kolom F moet in cel kolom C

Als het nodig is maak ik wel een voorbeeld spreadsheet, maar ik denk dat het zo wel duidelijk is?
 
Als het nodig is maak ik wel een voorbeeld spreadsheet, maar ik denk dat het zo wel duidelijk is?
Denk het niet.

Plaats een voorbeeld dat qua opmaak identiek is aan wat er moet gebeuren. Aangezien je zelf niets van VBA weet scheelt dat veel aanpassingen achteraf.
 
In de bijlage het spreadsheet. Heb alle locaties en benamingen letterlijk overgenomen, zoals je had gevraagd.

Wat is de bedoeling van de macro:

Uit blad 'januari' moeten bepaalde cellen van geselecteerde regels (bijvoorbeeld voor nu rij 4 en 5) gekopieerd worden naar tabblad 'Import'.
In tabblad 'Import' heb ik aangegeven uit welke kolom uit tabblad 'januari' moet worden gekopieerd.

Telkens moet de macro in tabblad 'Import' eerst alleen de kolommen A t/m D en F t/m L en S leegmaken.
De overige gegevens moeten blijven staan, niet overschrijven.

Na het kopiëren moet tabblad 'Import' worden opgeslagen als export.cvs UTF8 bestand bijvoorbeeld in map 'Documenten' .
Daarna moet er worden teruggekeerd naar tabblad 'januari' en gesaved.

Hoop dat het zo duidelijk is.

Alvast dank.
 

Bijlagen

Ik kan mij niet voorstellen dat het blad 'januari' in werkelijkheid zo in elkaar steekt. Gebruik ook geen samengevoegde cellen.
 
Zooitje van een workbook (en hoop ander vragen) maar goed...
Code:
Sub VulImport()
    Dim wb As Workbook: Set wb = ThisWorkbook
    Dim ws As Worksheet
    Set ws = Application.ActiveSheet
    Dim LastRow As Long
    
    sr = Selection.Row
    src = Selection.Rows.Count
    
        With Sheets("Import")
        LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
       
        For i = 2 To LastRow
        .Cells(i, "A").Value = ""
        .Cells(i, "B").Value = ""
        .Cells(i, "C").Value = ""
        .Cells(i, "D").Value = ""
        .Cells(i, "F").Value = ""
        .Cells(i, "G").Value = ""
        .Cells(i, "H").Value = ""
        .Cells(i, "I").Value = ""
        .Cells(i, "J").Value = ""
        .Cells(i, "K").Value = ""
        .Cells(i, "L").Value = ""
        .Cells(i, "S").Value = ""
        Next

    
    For j = 2 To src + 1
    .Cells(j, "A").Value = ws.Cells(sr, "K").Value
    .Cells(j, "B").Value = ws.Cells(sr, "O").Value
    .Cells(j, "C").Value = ws.Cells(sr, "N").Value
    .Cells(j, "D").Value = ws.Cells(sr, "M").Value
    .Cells(j, "F").Value = ws.Cells(sr, "P").Value
    .Cells(j, "G").Value = ws.Cells(sr, "Q").Value
    .Cells(j, "H").Value = ws.Cells(sr, "R").Value
    .Cells(j, "I").Value = ws.Cells(sr, "T").Value
    .Cells(j, "J").Value = ws.Cells(sr, "U").Value
    .Cells(j, "K").Value = ws.Cells(sr, "AR").Value
    .Cells(j, "L").Value = ws.Cells(sr, "AS").Value
    .Cells(j, "S").Value = ws.Cells(sr, "V").Value
    sr = sr + 1
    Next
    
        End With
    
Application.DisplayAlerts = False

ThisWorkbook.Sheets("Import").Copy
ActiveWorkbook.SaveAs Filename:="C:\temp\export.csv", FileFormat:=xlCSV, CreateBackup:=True
ActiveWorkbook.Close

Application.DisplayAlerts = True
    
End Sub
 
Kopieergedeelte

Dit is volgens mij de bedoeling.
De macro zal best korter kunnen maar hij doet wat hij moet doen en zo kan je het ook nog volgen en eventueel aanpassen.
Het extra blad staat erbij om te testen (terugkopieren) Die kan je zonder gevolgen weghalen.
Bij beide bladen staat op cel AA1 een formule voor de laatste regel (beide bladen iets verschil)
Als dat in de weg staat kan je dat op een willekeurige andere plaats zette maar dan moet je in de macro die celverwijzing aanpassen.
Ik verneem graag of je dit bedoelt.
Groet, Wim
 

Bijlagen

Is allemaal wel veel code om een range leeg te maken. Aan het vullen waag ik mij voorlopig niet.:d

Code:
Sub VenA()
  Sheets("import").Cells(1).CurrentRegion.Offset(1).Resize(, 19).ClearContents
End Sub
 
Volgens de beschrijving van Ts gaat dat in je code ook al fout.
Telkens moet de macro in tabblad 'Import' eerst alleen de kolommen A t/m D en F t/m L en S leegmaken.

Beter maar niet doen dan. :d
 
't is allemaal tegenstrijdig:rolleyes:

Ik wil echter niet meer dat het gehele tabblad Y leeggemaakt wordt, maar alleen de kolommen A t/m AT.

Laat de TS maar aangeven wat het moet worden en dan nog zal het wel niet kloppen.;)
 
Ik ga uit van zijn/haar laatste schrijven uit #7, dat zal meestal wel kloppen dan.
Je kan je altijd bedenken.

Als hij/zij zich weer bedenkt is het in de war.
 
Telkens moet de macro in tabblad 'Import' eerst alleen de kolommen A t/m D en F t/m L en S leegmaken.
Code:
Sub Leegmaken()
Dim LastRow As Long

With Sheets("Import")
    LastRow = .Cells(Rows.Count, 1).End(xlUp).Row
    .Range("A2:D" & LastRow).ClearContents
    .Range("F2:L" & LastRow).ClearContents
    .Range("S2:S" & LastRow).ClearContents
End With

End Sub
@VenA, @HSV , waarschijnlijk kan het nog korter:D
 
yep,:d

Code:
Sub VenA()
  With Sheets("import").Cells(1).CurrentRegion.Offset(1)
    Union(.Columns(1).Resize(, 4), .Columns(6).Resize(, 7), .Columns(19)).ClearContents
  End With
End Sub
 
Dacht het wel.:D

Toch nog ietsie pietsie korter

Code:
With Sheets("import").Cells(2, 1).CurrentRegion
    Union(.Columns(1).Resize(, 4), .Columns(6).Resize(, 7), .Columns(19)).ClearContents
  End With
 
Laatst bewerkt:
Moet je wel de kopteksten opnieuw plaatsen. En dan wordt het weer langer.;)
 
Beter wat proberen dan achteroverleunen en wachten op een panklare oplossing toch?:thumb:
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan