06. marts 2016 - 16:50Der er
19 kommentarer og 1 løsning
VBA hjælp
Hej Eksperter, håber I kan hjælpe mig. Min handling er, at jeg altid marker 6 celler lige efter hinanden i samme række i mit dataark, kopier og indsætter specielt værdier i et andet ark. Mit problem er at jeg nogen gange glemmer at slette kopieret data i dataarket, hvilket giver problemer andre steder. Kan man lave en kode, der sletter det markerede område i dataarket, når kopieret data er indsat i det andet ark? Har prøvet at bruge klip funktionen, men der får jeg formaterne med fra dataarket.
Det er lidt svært at forklare, men jeg prøver. Hver række er et batchnr. (Kolonne A)som indeholder en masse data til og med kolonne HH, oplysningerne omkring batchnumret er delt op i 35 x 6 celler. Har lagt et link til et excelfil med yderlig forklaring
@boro23 Svært at forklare... Jamen ligger de 6 celler du vil kopiere ikke samme sted hver gang, eller er der ikke et system i hvordan de findes.
Hvis de ikke ligger samme sted hver gang, er der så et system i det så vi kan detectere hvor de skal findes, elsempelvis at batchnummeret starter altid med disse tegn, eller hvad ved jeg - hvis du kan beskrive systemet i det, så kan vi også automatisere det.
Jeg har også brug for at vide hvordan du date du vil sætte ind skal sættes op ( i samme rækkefølge som derfra hvor de er kopieret, eler?
det ville være rigtig godt at kende i hvilke kolonner data skal findes.
Jeg glemte lige at skrive, at jeg ikke har mulighed gå ind på en fildelings-tjeneste, og se filen du har postet. Dette er et sikkerheds-issue, og da jeg sidder på jobbet nu så kan jeg ikke gå ind, hvor der potentielt ligger materiale fra skumle personer, der ikke vil noget godt.
Hej boro. Jeg foretrækker nu at yde hjælp til selvhjælp, så den der bliver hjulpet også kommer lidt videre, og får udbygget sine egne evner.
Hvis du gerne vil have mig til at se på filen, så send den til: folj(snabel a)novonordisk.com (skriver det sådan for at snyde de søgerobotter der crawler hele nettet igennem, for at finde adresser de kan spamme)
Men jeg får stadig brug for at vide hvilke dataer du gerne vil kopiere over i det andet sheet.
Du behøves ikke at sende. Jeg har tjekket din profil, og din historik indikerer ikke noget i retning af en skummel person.
Nu har jeg åbnet filen på min privat-pc, og kan se lidt om hvad du mener. Det lille billede du har indsat sammen med den forklarende tekst, er det de data der står i et andet sheet, som der skal kopieres fra?
Nu kender jeg jo ikke så meget til arbejdsgangen i det du laver, men kan jeg se det som nogle batche hvor der løbende kommer 8 datasæt fra produktionen. stemmer det?
Jeg prøver at se systemet, for det er jo nødvendigt at tænke i systemer hvis det skal kunne automatiseres. Optræder dine data altid sådan som illustreret med batchnummer lige til venstre for de 6 celler der skal kopieres?
Det lille billede viser det, jeg gerne vil have koden skal slette (ark1 i eks. fil) De 6 celler er enheder, tilhørende et batchnr., første celle af de 6 celler er enhedens nr. Det jeg gør, er at plukker udvalgte enheder over i ark2 fra ark1 (Eks. fil). Glemmer jeg at slette de plukkede enheder i ark1, går der ged i et andet ark.
Jeg kan stadig ikke lade være at tænke lidt videre...
Ville det slet ikke være attraktivt at når du afvikler din automatiserede sletning af indholdet i de seks celler, at proceduren der afvikles tager de markerede data og indsætter dem ud for den rette batch, eller hvis den ikke allrede findes på listen, så kunne den jo blive indskrevet som den næste på listen, og data indsat på rette plads.
Hvis det kunne være attraktivt, så er næste spm. ligger batchnummeret altid i den samme kolonne i Det ark du vil kopiere data fra?
Hej Folmer Når jeg f.eks plukker enheder, kan det godt ske fra flere forskellige batchnumre, jeg har ikke behov for at få batchnumre med fra de enheder jeg plukker, fordi 2. celle af de 6 angiver rækkenumret for batchnumret, den bliver hentet via en formel i arket "plukseddel". Der er desværre ikke plads til nogle ændringer har min chef påpeget. Håber du kan finde en løsning ud fra min lange og omstændige forklaring. ;-)
Det lyder som om du har arbejdet lidt med VBA før, derfor poster jeg i første omgang den procedure jeg har kreeret til dig. Du kan blot gå ind i VBA-editor og indsætte den i et modul, og afvikle proceduren.
Vi skal blot have fundet en brugbar måde du kan bruge når du vil afvikle proceduren. Det er jo sikkert ikke brugbart nok at du først skal markere de 6 celler, og derefter bruge genvejen Ctrl + F8 for at få listet Macros der kan afvikles, men til en første test, kan det måske anvendes.
Jeg har indrettet proceduren så den anvender nogle få konstanter. Dem er du nødt til at have stående øverst i dit modul.
' ' konstanter der kan reguleres senere hvis der bliver behov Public Const NUMBEROFCELLS As Integer = 6 ' antalceller i markeringen styres fra en Public Const FIRSTNONMARGINCOLUMN As Integer = 20 ' definerer i hvilken kolonne der er første datakolonne Public Const DESTINATIONSHEETINDEX As Integer = 1 ' definerer jeg at arket som data overføres til er det ark der ligger først i rækken af ark
Sub DataTransfer()
SelectionAddress = Selection.Address SourceDataSheet = ActiveSheet.Name DestinationDataSheet = Sheets(DESTINATIONSHEETINDEX).Name ' her forudsætter jeg at arket som data overføres til er det ork der ligger først i rækken af ark
SourceDataArray = Sheets(SourceDataSheet).Range(SelectionAddress) ' vi smider data fra det markerede område ind i et array - det er nemlig smart fordi det kun er values og ikke formler vi får ind i vores araay
CellCount = UBound(SourceDataArray, 2) ' vi tæller lige hvor mange celler vi har i vores array
If Not CellCount = 6 Then ' hvis der ikke er valgt 6 celler, så vil vi stoppe afviklingen MsgBox "Der er ikke valgt 6 celler til overførsel, som forventet" & Chr(10) & "Proceduren stoppet", vbCritical Exit Sub ' vi stopper afviklingen her End If
' nu vil vi sætte data ind der hvor de skal overføres til
' først skal vi lige beregne DestinationCells DestinationRow = SourceDataArray(1, 2) ' rækkenummeret trækker vi direkte ud af vores array 1. celle, 2. kolonne ' beregner rette startkolonne til indsæt data DestinationColumn = ((SourceDataArray(1, 1) - 1) * NUMBEROFCELLS) + FIRSTNONMARGINCOLUMN ' kolonnenummer beregner vi ud fra det der står i vores array 1. celle, 1. kolonne ' MsgBox DestinationRow ' MsgBox DestinationColumn
' her smider vi values fra vores array ind i på den beregnede placering (i et hug) Sheets(DestinationDataSheet).Range(SelectionAddress) = SourceDataArray
' og så mangler kun at slette source-data Sheets(SourceDataSheet).Range(SelectionAddress).ClearContents
Jeg har lige en lille tilføjelse som du kan tilføje når du har testet at det virker.
Der kan nemlig opstå en fejl hvis du eksempelvis kun har markeret én celle, så kan koden ikke kaste dataene ind i et array, og senere tælle hvor mange celler der var.
Derfor anbefaler jeg at du tilføjer en linie der slår disse fejlmeddelelser fra.
Det med at slå fejlmeddelelser fra er først godt når du har testet at koden virker, for det slår i virkeligheden alle fejlmedelelser fra, og det er jo ikke hensigtsmæssigt i testsituationen.
For at den ikke skal melde fejle hvis der kun er markeret én celle så skal du tilføje lige før linien: CellCount = UBound(SourceDataArray, 2). en linie så det kommer til at se sådan ud
On Error Resume Next CellCount = UBound(SourceDataArray, 2) ' vi tæller lige hvor mange celler vi har i vores array
Det ken jeg godt fra mit eget arbejde, at der må prioriteres i opgaverne. Indtil da, så smider jeg også lige et svar - jeg satser jo på at det leverede også spiller hos dig.
Hej Folmer, mange tak for din hjælp, har ikke fået koden afprøvet endnu, men efter påske får jeg den testet, håber jeg må kontakte dig hvis jeg får problemer med koden. God påske når du når dertil. Hilsen Kim
Hvis jeg har forstået problemet korrekt, så bør det også virke hos dig. Du vender blot tilbage hvis bliver behov for yderligere hjælp.
Er på påskeferie nu, men efter påske er jeg klar til at hjælpe dig helt i mål, hvis der bliver behov.
Go' påske. Folmer
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.