Just nu i M3-nätverket
Gå till innehåll

Lat behöver kom-igång-hjälp


Mikael63

Rekommendera Poster

Skulle egentligen för länge sedan ha tagit tag i detta men har, ärligt talat, inte idats.

Jag skulle kunna börja och testa mig fram genom att spela in makro men kommer nog någonstans att stöta på ett hinder och i bland går man över ån för att hämta vatten.

Söker här lite input på mitt "problem":

 

Har en Excelbok som vi för min bekvämlighets skull kan kalla 8.xls

Denna bok kommer alltid att vara öppen och det är till den jag vill kopiera data, från andra böcker.

Den har jag öppen och jag har manuellt frigjort en tom rad och jag ser till att cellen i  B är aktiv. Detta får jag alltså själv se till att ha utfört innan jag kör makrot.

(Kolumn A är dold)

 

Sedan kommer jag att ha en annan bok öppen som vi kan kalla 7.xls

Denna är alltså inte samma bok varje gång, den kommer att få olika filnamn.

Boken innehåller bara ett blad och bladet heter också olika i varje av dessa 7.xls. Bladets namn vill jag få över till 8.xls - mer om det lite senare.

Jag kommer även här att se till att manuellt ha en specifik cell, i kolumn A, aktiv och jag kommer att köra makrot från denna bok (men makrot får ligga i "Mina makron" eller vad den nu hette)

 

Det jag då vill göra är att sammanfoga A med B och med ett mellanslag mellan. Denna sammafogning behöver, eller ska, inte finnas kvar i 7.xls men om man vill använda en kolumn temporärt är nästa lediga M (om man sammanfogar där förs och sedan raderar den när man är klar med hela uppgiften, vilket nog jag skulle använt mig av)

Det sammanfogade värdet ska sedan över till 8.xls i C

 

Från C i 7.xls ska värdet över till B i 8.xls

 

Bladets namn i 7.xls ska till D i 8.xls (och det är här jag tror jag kommer att stöta på problem)

 

Från H i 7.xls ska värdet över till G i 8.xls

 

Klart.

Jag kommer alltså att se till att jag befinner mig på rätt rad och i en förutbestämd kolumn i resp. dokument men det vore naturligtvis bra om det räckte att jag står på rätt rad, enbart.

 

Excel 2013

Länk till kommentar
Dela på andra webbplatser

Lite för mycket data i din fråga, enklare att hjälpa med små enkla steg.

 

Kanske första steget i detta, att hitta dina data?

Två vägar finnas

1: Med VBA, en fildialog, öppna/hitta din fil och namnet på bladet du vill kopiera från. Skriva in dessa i cell och låta formler, INDIREKT, hämta värden på filen VBA-öppnar.

2: Som ovan men låta VBA kopiera in värdena i din bok.

 

Och här finns då två vägar till

1: Låta formler klistra ihop dina värden

2: Låta VBA klistra ihop dina värden.

 

Fast det låter som en ren VBA-lösning är det du söker.

Om jag minns rätt, du har väl viss kodningserfarenhet? Några hintar kanske räcker?

Länk till kommentar
Dela på andra webbplatser

Tack!

 

Nja, att hitta data behöver inte göras, jag ser till att jag befinner mig på en specifik cell både i boken där källan finns och i boken där målet är.

Målet är alltid en och samma fil. När uppgiften ska köras.

Källan är olika filer men alltid aktiv bok/flik.

 

Ingen kodningserfarenhet så att jag skulle sätta mig och skriva kod från början. Däremot att pilla lite i ett inspelat makro skulle fungera.

 

Jag tar alltså en och en rad åt gången, dvs. markerar rätt (ny tom) rad i målet, växlar till källan, ställer mig på rätt rad i första kolumnen, kör (det tänkta) makrot som fyller i data i målet.

Skapar en ny rad, där det ska in en ny rad, i målet, växlar till källan, markerar nästa rad, kör makrot.

osv.

 

Det handlar om 5 till 15 gånger, för varje ny källa och idag handskriver jag av direkt i målet, med källan öppen på en separat skärm.

Eftersom det inte är allt för stor datamängd och jag har betalt för att göra just det, och har väl gjort så med ett hundratal dokument... 

Länk till kommentar
Dela på andra webbplatser

Mmh, det är kod som ska fungera med handpåläggning emellanåt?

Det går inte att skapa kod som i ett nafs gör allt?

 

Jag uppskattar alltid exempel. Skapa gärna ett med fiktiva data där du visar vad du har och vad du vill ha.

 

men den dummy-rutin

Sub MyCombiner()
    Dim rnData1 As Range, rnData2 As Range, rnTarget As Range
    On Error Resume Next
    Do While True
        ThisWorkbook.Activate
        Set rnData1 = Application.InputBox("Markera cell 1", "Kombinera", Type:=8)
        If rnData1 Is Nothing Then Exit Sub
        Workbooks(2).Activate
        Set rnData2 = Application.InputBox("Markera cell 2", "Kombinera", Type:=8)
        If rnData2 Is Nothing Then Exit Sub
        ThisWorkbook.Activate
        Set rnTarget = Application.InputBox("Markera målcell", "Kombinera", Type:=8)
        If rnTarget Is Nothing Then Exit Sub
        On Error GoTo 0
        MyAction rnData1, rnData2, rnTarget
    Wend
End Sub


Sub MyAction(rnData1 As Range, rnData2 As Range, rnTarget As Range)
    rnTarget = rnData1 & " " & rnData2

End Sub

Notera bara att adresseringen av arbetsböcker är...skakig. Koden måste aktivera bok två för att det ska fungera och ovan har jag satt att just aktivera bok två.

Enklast nog om man lägger till i koden en dialog som öppnar bok två så att koden vet vilken bok det är.

 

Men principen kan vi testa.

Du väljer två celler med data och en cell att klistra in dessa i.

 

 

Länk till kommentar
Dela på andra webbplatser

Jag vill helst inte svara på några frågor via dialoger när makrot körs utan jag får se till att jag befinner mig på "Aktiv cell" både i källa och mål. (relativa referenser)

Eller som jag väl skrev inledningsvis är det ju bra om jag manuellt bara behöver se till att aktiv cell är i rätt rad. Det är ju alltid samma kolumners värden som ska  kopieras in.

 

Bifogar två ihopslängda exempel (skapade med Planmaker i Linux)

 

Jag öppnar alltså först filen mål.xls och ser till att skapa en tom rad, i exemplet blir det rad 7

Jag ser till att aktiv cell är B7

 

Därefter öppnar jag i en egen instans av Excel filen källa.xls

och markerar första cellen i den rad som jag vill få över värden från, i exemplet blir då aktiv cell A5.

Därefter kör jag makro via en knapp i verktygsfältet och alltså i den instans av Excel som är källa.xls

 

Då vill jag alltså att makrot ska ta värdet i aktiv cell och sammanfoga det med cellen till höger om den aktiva, peta in ett mellanslag mellan dessa värden, och klistra in detta värde i mål.xls (som alltså är samma filnamn varje gång) i cellen som är till höger om dess aktiva cell.

Jag tänker mig att det är lättast att komma ihåg att alltid stå längst till vänster, A var dold

I exemplet ska då 'ABCD' och '12' bli 'ABCD 12'

 

Vidare då ska målets värde för 'Från' hämtas från källans bladnamn.

Värden för 'Nummer' och 'Till' ska hämtas från respektive plats.

 

Källa.xls innehåller alltså mer information än vad som ska in i mål.xls.

Mål.xls är en sammanfattning av alla de olika källa.xls som finns.

 

 

källa.xls

mål.xls

Länk till kommentar
Dela på andra webbplatser

Okej...

 

Ha båda filerna öppna, en som heter mål.xls och en med godtyckligt namn

Kör makrot starter.

Om målcellen inte är tom kommer en varning poppa upp. Du kan ta bort denna, lade den bara där för att det inte är fel att ha en. Det VBA skriver över går inte att få tillbaka genom att ångra.

 

Lägg koden i filen Egna makron, dvs personal.xlsb, och koppla till en knapp i verktygsfält eller snabbtangenter.

Sub Starter()
    Dim rnSource As Range
    Set rnSource = ActiveCell

   ' Application.StatusBar = "Makro start, startcell " & rnSource.Address & ", " & rnSource.Parent.Name
    
    Dim wbTarget As Workbook
    Set wbTarget = Workbooks("mål.xls")
    wbTarget.Activate
    Dim rnTarget As Range
    Set rnTarget = ActiveCell
    
    Action rnSource, rnTarget
    
    
End Sub

Sub Action(rnSource As Range, rnTarget As Range)
    If rnTarget.Offset(0, 1) <> "" Then
        If MsgBox("Målcell ej tom, varning går ej att ångra. Fortsätta?", vbOKCancel, "Varning") = vbCancel Then Exit Sub
    End If
    rnTarget.Offset(0, 1) = rnSource & " " & rnSource.Offset(0, 1)
    rnTarget.Offset(0, 3) = rnSource.Parent.Name
    rnTarget.Offset(0, 6) = rnSource.Offset(0, 7)

End Sub

 

Länk till kommentar
Dela på andra webbplatser

Tack!

 

Får dock felmeddelande:

 

post-52940-0-07826600-1409558724.png

 

post-52940-0-19910000-1409558745_thumb.png

 

Tillägg: Jag kör alltså makrot när jag har boken med det godtyckliga namnet aktivt.

Länk till kommentar
Dela på andra webbplatser

har du en bok med EXAKT det namnet öppen ska det fungera. Exakt det namnet.

mål.xls.

kontrollera.

 

borde inte behövas mer än det. Det ska inte vara beroende av sökväg eller liknande vad jag vet.

 

fast ja, filerna måste vara öppna i samma instans av Excel. Om du klickar upp filerna kan det bli olika instanser av Excel och då kan du inte nå fil öppen av andra instansen från den första tror jag.

Länk till kommentar
Dela på andra webbplatser

Exakt det namnet.

mål.xls.

kontrollera.

 Jadå, se skärmdumpen

 

fast ja, filerna måste vara öppna i samma instans av Excel. Om du klickar upp filerna kan det bli olika instanser av Excel och då kan du inte nå fil öppen av andra instansen från den första tror jag.

Okej, ja då blir det problem. det är olika instanser, jag kör dessa på separata skärmar. (Inte bara just dessa Excel-dokument)

Sökvägen till mål.xls, eller 60008.xls som den egentligen heter är alltid densamma.

Länk till kommentar
Dela på andra webbplatser

Kanske att det då fungerar med att ange hela sökvägen i funktionen, dvs

Set wbTarget = Workbooks("d:\whatever\mål.xls")

 

eller leta reda på den andra instansen på något vis

http://excelribbon.tips.net/T009452_Finding_Other_Instances_of_Excel_in_a_Macro.html

fast den där metoden ger inte tillgång till böckerna som är öppna i andra instansen.

 

Enklast, absolut enklast, är därmed om mål-filen är stängd när du startar och koden öppnar, ändrar, sparar och stänger den.

Om nu filerna inte kan öppnas i samma instans, det vore ännu enklare.

Länk till kommentar
Dela på andra webbplatser

 

Kanske att det då fungerar med att ange hela sökvägen i funktionen, dvs

Set wbTarget = Workbooks("d:\whatever\mål.xls")

Samma felmeddelande.

 

Skulle man kunna, när detta körs?:

Skapa en ny flik "Blad2" (typ) och från den aktiva fliken göra proceduren med att sammanfoga, hämta bladnamn, klistra in i rätt kolumn, Klippa ut hela raden (som nu har kolumnindelning lika mål.xls) få detta att fastna i Urklipp, radera "Blad2". Inte tömma Urklipp. och sedan växlar jag manuellt till mål.xls och väljer Klistra in.

 

Eller mellanlagra värden i en vanlig textfil.

Ett makro som tar bort, eller tömmer textfilen, skriver dit värden.

Ett annat makro som läser textfilen klistrar in dess värden.

 

Tror jag måste testa lite jag med...

Länk till kommentar
Dela på andra webbplatser

det går, nästan

När temp-bladet raderas, töms urklipp.

däremot skapa en temp-bok, klistra in, kopiera och stäng.

 

Ligger sedan i urklipp.

Sub Starter()
    Dim rnSource As Range
    Set rnSource = ActiveCell

   ' Application.StatusBar = "Makro start, startcell " & rnSource.Address & ", " & rnSource.Parent.Name
    Dim wb As Workbook
    Set wb = Workbooks.Add()
    
    Dim ws As Worksheet
    Set ws = wb.Sheets(1) 'ActiveWorkbook.Sheets.Add()
    
    Dim rnTarget As Range
    Set rnTarget = ws.Range("a1")
    
    Action rnSource, rnTarget
    
    rnTarget.EntireRow.Copy
    Application.DisplayAlerts = False
    wb.Close False
End Sub

samma sekundära kod som ovan.

Länk till kommentar
Dela på andra webbplatser

Nu är det nära! :D

 

Har justerat några offset och lagt till en till sådan rad.

Nu är det flikens namn som inte riktigt fungerar eftersom mina flikar börjar med ett plustecken.

resultatet blir nu, med skarpa värden:

2101    EKLK 4G1,5    22000            M22208-Q1

men skulle behöva bli:

2101    EKLK 4G1,5    +22000            M22208-Q1
 

Länk till kommentar
Dela på andra webbplatser

rnTarget.Offset(0, 3) = "+" & rnSource.Parent.Name

 

borde fungera.

 

rnTarget.Offset(0, 2) = "'+'" & rnSource.Parent.Name

Gav resultatet ++22000 i mitt exempel.

 

Men

rnTarget.Offset(0, 2) = "'" & rnSource.Parent.Name (lite svårt att se men alltså en sådan enkelsnuff som man får ta till för att Excel ska ignorera + - = osv.)

fungerade.

 

Stort tack - problemet kan anses som löst!

Länk till kommentar
Dela på andra webbplatser

Ah, ja, excel tolkar det som ett värde, en funktion och då försvinner plustecknet. Text är ju ett specialfal, tal är det standardfallet i Excel, varvid man måste berätta för Excel att det är text. 

 

Bra fångat.

Länk till kommentar
Dela på andra webbplatser

  • 4 months later...

Hur skulle koden se ut om man i slutet på detta makro vill markera nästa cell, i aktiv kolumn, som innehåller ett värde?

Om ingen cell med värde hittas är det okej med ett felmeddelande men det som hamnat i urklipp måste vara kvar.

 

Tillägg: med värde menar jag en icke tom cell

Länk till kommentar
Dela på andra webbplatser

Nu är jag inte helt med vad du vill.

Vad för aktiv kolumn?

Är det inom  Starter-funktionen, den kolumn om variabeln rnTarget refererar till?

Fast vilken är sista cellen? Dvs från vilken cell ska vi leta efter nästa cell med värde i?

I sig inget svårt, bara en koll om nästa har värde samt göra test av kod som gör samma som CTRL + Pil ned.

 

 

men som sagt, inte helt med på vad du menar.

Länk till kommentar
Dela på andra webbplatser

 

I sig inget svårt, bara en koll om nästa har värde samt göra test av kod som gör samma som CTRL + Pil ned.

 

Exakt!

 

Och tack för info om det kommandot, kände inte till det :thumbsup:

Borde kunna spela in ett makro och sedan knycka den koden...

Länk till kommentar
Dela på andra webbplatser

Cells(1, 1).End(xlDown).Select

exempelvis. Byt bara referensen Cells(1,1) mot den du önskar starta från. 

Länk till kommentar
Dela på andra webbplatser

Cells(1, 1).End(xlDown).Select

 

exempelvis. Byt bara referensen Cells(1,1) mot den du önskar starta från. 

 

Nej, det vill sig inte.. jag får ingen markörförflyttning.

 

Den cell jag önskar starta från är den cell som är markerad när makrot körs.

Så här arbetar jag nu:

 

1. Markerar en cell manuellt i Bok1

2. Kör makrot

3. Växlar till Bok2

4. Klistrar in (Stegar (oftast) ner en rad.)

 

5. Växlar tillbaks till Bok1

6. Markerar nästa cell som innehåller något i samma kolumn (A)

7. Kör makrot, växlar till Bok2

8. Klistrar in (Stegar (oftast) ner en rad.)

osv

 

Jag vill alltså att punkt 6. ska utföras automatiskt direkt efter punkt 2. eller sist i punkt 2.

Så att det redan är gjort när jag nästa gång växlar tillbaks till Bok1.

Länk till kommentar
Dela på andra webbplatser

Mmh, problemet är det där manuella steget i koden.

 

Det som man skulle kunna tänka sig är att du startar det hela via en kod som frågar efter en referens. Koden sparar referensen och nästa gång du kör frågan samma session söker den efter nästa cell med data i kolumnen.

 

Du måste dock starta upp koden efter varje kopiering av data, förslagsvis via en snabbknapp. 

 

Det går inte att komma runt behovet av manuella steget?

Länk till kommentar
Dela på andra webbplatser

Du måste dock starta upp koden efter varje kopiering av data, förslagsvis via en snabbknapp

 

När jag i inlägg #21 skriver att jag kör makrot gör jag det via en snabbknapp.

Makrot i övrigt fungerar mycket bra.

 

Det går inte att komma runt behovet av manuella steget?

Nej. Eller ja, jag kan ju använda Ctrl + Pil ned nu när jag vet om det. I steg 6.

 

Men varför kan man inte simulera Ctrl + Pil ned någonstans i koden när rätt data kopierats?

 

Koden i sin helhet:

Sub CollectYttre()
    Dim rnSource As Range
    Set rnSource = ActiveCell

   ' Application.StatusBar = "Makro start, startcell " & rnSource.Address & ", " & rnSource.Parent.Name
    Dim wb As Workbook
    Set wb = Workbooks.Add()
    
    Dim ws As Worksheet
    Set ws = wb.Sheets(1) 'ActiveWorkbook.Sheets.Add()
    
    Dim rnTarget As Range
    Set rnTarget = ws.Range("a1")
    
    Action rnSource, rnTarget
    
    rnTarget.EntireRow.Copy
    Application.DisplayAlerts = False
    wb.Close False
        
End Sub
Sub Action(rnSource As Range, rnTarget As Range)
    If rnTarget.Offset(0, 1) <> "" Then
        If MsgBox("Målcell ej tom, varning går ej att ångra. Fortsätta?", vbOKCancel, "Varning") = vbCancel Then Exit Sub
    End If
    rnTarget.Offset(0, 1) = rnSource & " " & rnSource.Offset(0, 1)
    rnTarget.Offset(0, 0) = rnSource.Offset(0, 2)
    rnTarget.Offset(0, 2) = "'" & rnSource.Parent.Name
    rnTarget.Offset(0, 5) = rnSource.Offset(0, 7)
    rnTarget.Offset(0, 8) = rnSource.Offset(0, 10)
    
End Sub

Länk till kommentar
Dela på andra webbplatser

Ah okej

 

testa lägg in i slutet

     rnSource.Parent.Activate
     If rnSource.Offset(1) <> "" Then
        rnSource.Offset(1).Select
    Else
        If rnSource.End(xlDown) = "" Then Exit Sub
        rnSource.End(xlDown).Select
    End If

så borde du få det du vill.

Länk till kommentar
Dela på andra webbplatser

Tackar på förhand. Kommer inte kunna testa detta förrän om nån dag men återkopplar givetvis då.

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...