27. februar 2020 - 13:25 Der er 13 kommentarer og
1 løsning

VBA - sammensæt mappesti pba. celleværdier

Jeg prøver at lave en makro uden held.

I praksis med cellereferencer er det ca. sådan her:
Første del af mappesti hedder: Q:\Budgetopfølgning -
Så skal den se på celle B9, tage de første 3 bogstaver og indsæt i mappesti bagved bindestregen, dernæst skal den kigge på D2, tage tallet derfra og indsæt som næste led i mappesti.
Og så afslutte med igen at tage de første 3 venstre bogstaver i B9 og sætte dem sammen med _Center.xlsm, som så udgøre det sidste led

Når den har den fulde mappesti skal den åbne filen, kopiere fra række C400:X400 og sætte det ind i det første ark som værdier.

Derefter skal den starte forfra og tage celle B10 (ny målcelle) og gøre nøjagtig det samme. Men stadig holde fast i D2

Når den så når en celle som er tom, skal den stoppe.

Håber nogen kan hjælpe !
Avatar billede thomas_bk Ekspert
27. februar 2020 - 15:08 #1
Når du prøver, går du så trinvist frem?
Eller går du direkte i mål?

Hvis du har vanskeligheder med koden, så vil jeg anbefale eksempelvis i dette tilfælde at bygge makroen til først at bygge filstien og skrive den i et tomt felt og herefter lave åbning af filen og så videre.
Så har du mulighed for at se hvor det begynder at fejle.
27. februar 2020 - 16:00 #2
Trinvist.

Sidder lige præcis fast i delen, hvor den skal opbygge filstien
Lige pt. ser den således ud:
Sub Hent_Data()

Dim strF As String, strP As String
Dim wb As Workbook
Dim ws As Worksheet

Application.ScreenUpdating = False

Const Rootpath As String = "Q:\By - *"

strP = Left("B9", 3).Value & "\" & Range("D2").Value & "\" & Budgetopfølgning

strF = Left(B9, 3).Value_By.xlsm
27. februar 2020 - 16:55 #3
Denne virker hvor B9 er statisk, men den skal rulle videre til B10 osv, indtil B** er tom. Hvordan gør jeg denne dynamisk og skal Anystring ikke redefineres igen og igen?

Sub Hent_Data()

Dim strF As String, strP As String, strH As String
Dim wb As Workbook
Dim ws As Worksheet
Dim AnyString, Mystr

AnyString = Range("B9")

Application.AskToUpdateLinks = False
Application.ScreenUpdating = False

strH = "Q:\Budgetopfølgning - " & Left(AnyString, 3)

strP = Range("D2").Value & "\" & "Budgetopfølgning"

strF = Left(AnyString, 3) & "_Center.xlsm"

    'Do While strF <> vbNullString
   
    On Error GoTo Førslut
   
        Set wb = Workbooks.Open(strH & "\" & strP & "\" & strF)
        Set ws = wb.Sheets(1)
        wb.Close Savechanges:=True
                   
    strF = Dir()

Førslut: 'Ingentings-handling'

Application.AskToUpdateLinks = True
Application.ScreenUpdating = True


End Sub
Avatar billede thomas_bk Ekspert
27. februar 2020 - 16:56 #4
Hvad fejler den med?

Gør evt det at bruge msgbox funktionaliteten i ‘immidiate window’ til at se hvad din kode danner af resultat.
Evt også lade den skrive resultatet af din kode til et felt for at se resultatet.
Avatar billede thomas_bk Ekspert
27. februar 2020 - 17:16 #5
Første punkt

Dim anystring as range
Avatar billede thomas_bk Ekspert
27. februar 2020 - 17:20 #6
Næste punkt

Opbyg din ‘do while’ med udgangspunkt i B9 og for hvert loop bevæg dig en celle ned. Loop’et skal slutte når b? er tom (<>””)

Husk at dit loop skal afsluttes med ‘loop’ for at starte på næste gennemløb

https://www.excel-easy.com/vba/loop.html
27. februar 2020 - 17:57 #7
Kigger på det i morgen tidlig!
Tak for input
28. februar 2020 - 09:48 #8
Kan jeg ud fra Anystring, få excel til at vælge en celle?
Så hvis jeg har defineret Anystring = Kolonne B & Række 9
Hvordan får jeg den så til at vælge celle (Kolonne B+1 & Række 9)??

Foreløbig Kode:

Sub Hent_Data()

Dim strF As String, strP As String
Dim Kolonne As String
Dim Række As Long
Dim wb As Workbook
Dim ws As Worksheet
Dim AnyString, Mystr

Kolonne = "B"
Række = 9
AnyString = ActiveSheet.Range(Kolonne & Række).Value

Application.AskToUpdateLinks = False
Application.ScreenUpdating = False

Do While AnyString <> ""

strP = "Q:\Budgetopfølgning - " & Left(AnyString, 3) & "\" & Range("D2").Value & "\" & "Budgetopfølgning"

strF = Left(AnyString, 3) & "_Center.xlsm"
   
    On Error GoTo Førslut
   
        Set wb = Workbooks.Open(strP & "\" & strF)
        Set ws = wb.Sheets(1)
        Sheets("Center").Select
        Range("E400:AC400").Select
        Selection.Copy
        ThisWorkbook.Activate
        Sheets(5).Activate
        'ActiveSheet.Anystring1.Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
       
        wb.Close Savechanges:=True
                     
    AnyString = ActiveSheet.Range(Kolonne & Række + 1).Value

   
    Loop
   

Førslut: 'Ingentings-handling'

Application.AskToUpdateLinks = True
Application.ScreenUpdating = True


End Sub
28. februar 2020 - 09:49 #9
Linjen med "" 'ActiveSheet.Anystring1.Select "" er ikke med i koden
28. februar 2020 - 12:36 #10
Har et sidste spørgsmål.

Jeg får koden til at lægge 1 til Række inden LOOP. Kan jeg få den til at tælle antallet af loops som er kørt, og lægge det til "Række" i stedet 1? Eller gøre "Række" dynamisk Sådan så den ved hvert loop lægger:
1
1+1
1+1+1

Linje:
AnyString = ActiveSheet.Range(Kolonne & Række + 1).Value
Avatar billede thomas_bk Ekspert
28. februar 2020 - 13:11 #11
Denne er problematisk.
Dim AnyString, Mystr

Hvis jeg tolker dit forsøg rigtigt vil jeg foreslå
Dim anystring as range

Men måske du heller skal kalde denne variabel noget andet.
For eksempel CurrentCell

Hvis du tager udgangspunkt i en celle og ligger adressen ind i en variabel, så kan du nemt kalder dens værdi med .value og når du i slutningen af dit loop af færdig med den celle og vil til den næste kan du bruge .offset(1 ,0)

Så kort fortalt skal du have nedenstående flettet ind, jeg håber du forstår.

Dim CurrentCell as range

Set CurrentCell = range("B9")

Do while CurrentCell.value <> ""

Dit løkke indhold....

CurrentCell.offset(1,0)
Loop
Avatar billede thomas_bk Ekspert
28. februar 2020 - 13:25 #12
Sorry.

CurrentCell.offset(1,0) skal ændres til

CurrentCell = CurrentCell.offset(1,0)
28. februar 2020 - 14:46 #13
Fik det faktisk løst med Total og Count i Loopet.
Send et svar, så giver jeg point. Og mange tak for input!

Endelig kode:

Sub Hent_Data()

Dim strF As String, strP As String
Dim Kolonne As String
Dim Række As Long
Dim wb As Workbook
Dim ws As Worksheet
Dim Anystring, Mystr
Dim Total As Integer, Count As Integer

'Definere udgangspunkt - B9, hvor det øverste center står'
Kolonne = "B"
Række = 9
Anystring = ActiveSheet.Range(Kolonne & Række).Value

Total = 0

[C9].Activate

Application.AskToUpdateLinks = False
Application.ScreenUpdating = False

Do While Anystring <> ""

For Count = 1 To 1
Total = Total + Count

strP = "Q:\Budgetopfølgning - " & Left(Anystring, 3) & "\" & Range("D2").Value & "\" & "Budgetopfølgning"

strF = Left(Anystring, 3) & "_Center.xlsm"

    On Error GoTo Førslut
   
        Set wb = Workbooks.Open(strP & "\" & strF)
        Set ws = wb.Sheets(1)
            Sheets("Center").Select
            Range("E400:AC400").Select
            Selection.Copy
               
                ThisWorkbook.Activate
                Sheets(5).Activate
                ActiveCell.Select
                Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                :=False, Transpose:=False
       
            wb.Close Savechanges:=False

        ActiveCell.Offset(1, 0).Activate
        Anystring = ActiveSheet.Range(Kolonne & Række + Total).Value
       
        Next Count
    Loop
   

Førslut: 'Ingentings-handling'

Application.AskToUpdateLinks = True
Application.ScreenUpdating = True


End Sub
Avatar billede thomas_bk Ekspert
28. februar 2020 - 16:04 #14
Svar :-)
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester