Avatar billede mrkr Juniormester
08. oktober 2008 - 22:44 Der er 20 kommentarer og
1 løsning

hente data fra andet ark og tilbage igen.

Jeg har fået hjælp til denne makro, der henter data fra et ark til et andet.

Nu kunne jeg godt bruge en lille rettelse/tilføjelse.
Når den henter linjerne vil jeg gerne have at den fanger det linjenr. i arket 2008 som den henter data fra og indsætter dette nr. i kol T i det ark der hentes til.

Jeg er med på at de data den fanger i arket 2008 indsættes her:
ThisWorkbook.Sheets("2008").Cells.Range("A" & intI & ":Q" & intI).Copy ThisWorkbook.Sheets("IgangvSpec").Range("A" & intJ)
ThisWorkbook.Sheets("IgangvSpec").Range("S" & intJ) = "X"

Men den skal altså også indsætte det linjenr. den har hentet data fra i i kol T.

HVAD SKAL DET BRUGES TIL?
Grunden til at jeg gerne vil have linje nr indsat i de hentede linjer er at jeg efterfølgende skal have en makro der gør følgende:

Kigger i arket igangvspec i kol S.
Alle de linjer som har "X" i denne kolonne skal rettes i det oprindelige ark "2008".
Det eneste der skal rettes i linjen er at kol F i ark 2008 skal sættes til "Ja"

Her har jeg tænkt mig at den skal bruge det linjenr. der står i kol T til at identificere de linjer der er rettet.

Problem 1/makro1:
Indsætte oprindfeligt linjenr. i de hentede linjer fra ark 2008  i kol T

Problem 2/makro2:
Finde den tilsvarende linje i arket 2008 til alle de linjer der er markeret med X i arket "igangvspec" og sætte Cellen i kol F til "Ja"


Lidt kringlet, men håber på at det er forståeligt.


Sub IgangvSpec_hent_åbne_poster()
    Application.ScreenUpdating = False
    Dim intI As Integer
    Dim intJ As Integer
   
    intJ = 5
    Do Until (ThisWorkbook.Sheets("IgangvSpec").Cells.Range("B" & intJ) = "")
        intJ = intJ + 1
    Loop

    For intI = 5 To 25000
        If (ThisWorkbook.Sheets("2008").Cells.Range("B" & intI) = ThisWorkbook.Sheets("faktura").Range("faktura_kundenr") _
            And ThisWorkbook.Sheets("2008").Cells.Range("F" & intI) <> "Ja") Then
            ThisWorkbook.Sheets("2008").Cells.Range("A" & intI & ":Q" & intI).Copy ThisWorkbook.Sheets("IgangvSpec").Range("A" & intJ)
            ThisWorkbook.Sheets("IgangvSpec").Range("S" & intJ) = "X"
            intJ = intJ + 1
        End If
    Next intI
    End Sub
Avatar billede excelent Ekspert
10. oktober 2008 - 18:59 #1
linienr :

shSpec.Range("S" & intJ) = "X"
shSpec.Range("T" & intJ) = intI ' ****** NY
intJ = intJ + 1

er lidt i tvivl om hvad der skal ske med den anden
Avatar billede excelent Ekspert
10. oktober 2008 - 19:00 #2
ups det får du nok ikke meget ud af, havde rettet i koden
du får lige hele min kode

Sub Spec_hent()
    Application.ScreenUpdating = False
    Dim intI As Integer
    Dim intJ As Integer
   
    Set shSpec = ThisWorkbook.Sheets("IgangvSpec")
    Set sh2008 = ThisWorkbook.Sheets("2008")
    Set shFak = ThisWorkbook.Sheets("faktura")
   
   
    intJ = 5
    Do Until (shSpec.Cells.Range("B" & intJ) = "")
        intJ = intJ + 1
    Loop

    For intI = 5 To 25000
        If sh2008.Cells.Range("B" & intI) = shFak.Range("faktura_kundenr") And sh2008.Cells.Range("F" & intI) <> "Ja" Then
            sh2008.Cells.Range("A" & intI & ":Q" & intI).Copy shSpec.Range("A" & intJ)
            shSpec.Range("S" & intJ) = "X"
            shSpec.Range("T" & intJ) = intI
            intJ = intJ + 1
        End If
    Next intI
    End Sub
Avatar billede mrkr Juniormester
10. oktober 2008 - 21:17 #3
jep, nu er første del på plads.
Jeg har lige rettet en lille smule i koden, sådan at linjenr også bliver indsat i både arket 2008 + igangvspec. (ved ikke om det er nødvendigt)

STEP2 skal gøre følgende:
De linjer jer har fået overført til igangvspec har som udgangspunkt alle et "X" i kol. S.

I kolonne T står der desuden det "linjenr" som indholder de samme data i arket "2008".

Nu skal den nye makro finde de linjer der står i "igangvspec" ovre i "2008".
Hvis der står X i kol S i arket igangvspec så skal kol F i arket 2008 sættes til "Ja"
Hvis IKKE der står X i kol S i arket igangvspec så skal der ikke gøres noget.

Jeg regner med at linjenr som er indsat i kol T kan være med til at identificere hvilke linjer der er identiske.






Sub IgangvSpec_hent_åbne_poster2()
   
    Application.ScreenUpdating = False
    Dim intI As Integer
    Dim intJ As Integer
   
    Sheets("IgangvSpec").Select
    Range("A2:U200").Clear
    Sheets("2008").Range("T:T").Clear

    Set shSpec = ThisWorkbook.Sheets("IgangvSpec")
    Set sh2008 = ThisWorkbook.Sheets("2008")
    Set shFak = ThisWorkbook.Sheets("faktura")
   
    intJ = 5
    Do Until (shSpec.Cells.Range("B" & intJ) = "")
        intJ = intJ + 1
    Loop

    For intI = 5 To 25000
        If sh2008.Cells.Range("B" & intI) = shFak.Range("faktura_kundenr") And sh2008.Cells.Range("F" & intI) <> "Ja" Then
            ThisWorkbook.Sheets("2008").Cells.Range("S" & intI) = intI
            sh2008.Range("T" & intI) = intI
            sh2008.Cells.Range("A" & intI & ":T" & intI).Copy shSpec.Range("A" & intJ)
            shSpec.Range("S" & intJ) = "X"
            intJ = intJ + 1
        End If
    Next intI
   
End Sub
Avatar billede excelent Ekspert
11. oktober 2008 - 08:27 #4
Jeg kan ikke afprøve om det virker her, så men prøv denne

Sub Spec_hent()
    Application.ScreenUpdating = False
    Dim intI As Integer
    Dim intJ As Integer
   
    Set shSpec = ThisWorkbook.Sheets("IgangvSpec")
    Set sh2008 = ThisWorkbook.Sheets("2008")
    Set shFak = ThisWorkbook.Sheets("faktura")
   
   
    intJ = 5
    Do Until shSpec.Range("B" & intJ) = ""
        intJ = intJ + 1
    Loop

    For intI = 5 To 25000
        If sh2008.Range("B" & intI) = shFak.Range("faktura_kundenr") And sh2008.Range("F" & intI) <> "Ja" Then
            sh2008.Range("A" & intI & ":Q" & intI).Copy shSpec.Range("A" & intJ)
            shSpec.Range("S" & intJ) = "X"
            shSpec.Range("T" & intJ) = intI
            intJ = intJ + 1
        End If
        If shSpec.Range("S" & intI) = "X" Then
        sh2008.Range("F" & intI) = "ja"
        End If
    Next intI
    End Sub
Avatar billede mrkr Juniormester
11. oktober 2008 - 10:51 #5
Det er ikke helt sådan jeg ønskede det. Men det er vist fordi jeg ikke får forklaret mig ordentligt.

Den første makro du lavede er nu på plads. Nu skal vi have en anden makro der gøre noget andet.

Her kommer forklaringen:
1. Der hentes en masse linjer fra arket 2008 til iganvspec. Det kan være alt fra 1 til 100 linjer der flyttes.
I kolonne F står der altid JA i de linjer som er hentet.
I kolonne S har jeg fået indsat et "X" i alle linjer.
I kolonne T har jeg fået indsat det linjenr. hvor linjer oprindeligt kommer fra i arket 2008

2. Så retter jeg lidt i linjerne i arket igangvspec (jeg fjerner nogle af "x"érne i kol S

3. Nu ønsker jeg så en ny makro der tager alle de linjer som er i arket igangvspec som har et "X" i kol S og finder de samme i arket 2008 og ændrer kolonne F fra NEJ til JA.
I kolonne T i igangvspec har jeg fået indsat det oprindelige linjenr fra arket 2008 og jeg regner med at man kan bruge det nr. til at finde den oprindelige linje igen i arket 2008, nå der skal sættes et JA i kolonne F der.

Jeg vil tro at den skal se nogenlunde sådan ud, men det er ikke helt rigtigt.



Sub Spec_retur()
    Application.ScreenUpdating = False
    Dim intI As Integer
    Dim intJ As Integer
   
    Set shSpec = ThisWorkbook.Sheets("IgangvSpec")
    Set sh2008 = ThisWorkbook.Sheets("2008")

   
    intJ = 5
    Do Until shSpec.Range("B" & intJ) = ""
        intJ = intJ + 1
    Loop

    For intI = 5 To 25000
        If shspec.Range("S" & intI) = "X" Then
            sh2008.Range("F" & intI) = "ja"
        End If
    Next intI
End Sub
Avatar billede mrkr Juniormester
11. oktober 2008 - 10:53 #6
Det oprindelige linjenr i arket 2008 kunne jo godt være 15200, hvor imod linenr på den samme linje i arket igangvspec kun er 25.
Avatar billede excelent Ekspert
11. oktober 2008 - 12:32 #7
prøv:

Sub Spec_retur()
    Application.ScreenUpdating = False
    Dim intI As Integer
    Dim intJ As Integer
   
    Set shspec = ThisWorkbook.Sheets("IgangvSpec")
    Set sh2008 = ThisWorkbook.Sheets("2008")

   
    intJ = 5
    Do Until shspec.Range("B" & intJ) = ""
        intJ = intJ + 1
    Loop

    For intI = 5 To 25000
        If shspec.Range("S" & intI) = "X" Then
            sh2008.Range("F" & shspec.Range("T" & intI).Value) = "ja"
        End If
    Next intI
End Sub
Avatar billede mrkr Juniormester
11. oktober 2008 - 15:54 #8
ja, nu gør den lige det jeg gerne vil have den til.
Men den er rimelig langsom i det den gør.

Hvis der er 4 poster i arket igangvspec tager den ca 5 sekunder at køre denne makro.
Jeg kan ikke rigtig se hvorfor den tager så "lang" tid.
Ved flere poster, (som der typisk er" vil det blive til rimelig lang vente tid.

Der er typsik 2-100 linjer i arket igangvspec, som skal rettes.
Der er min. 20.000 linjer i arket 2008.

Men det burde vel ikke gøre koden langsom, da den får "foræret" hvilket linje den skal rette i arket 2008, udfra hvad der står i kolonne T.

Hvis den ikke kan blive hurtigere er det også ok, du har jo løst mit problem.
Jeg kan evt  sende en mail med arket for at du nemmere kan se hvad jeg mener
Avatar billede excelent Ekspert
11. oktober 2008 - 16:10 #9
ja prøv send filen, så skal jeg forsøge
hvad gør denne løkke forøvrigt ?

  intJ = 5
    Do Until shspec.Range("B" & intJ) = ""
        intJ = intJ + 1
    Loop

det ser ikke ud til den anvendes i denne kode
Avatar billede excelent Ekspert
11. oktober 2008 - 16:10 #10
pm@madsen.tdcadsl.dk
Avatar billede kabbak Professor
12. oktober 2008 - 09:24 #11
prøv denne, den er ikke testet

Sub Spec_retur()
    Dim RW As Long, Data1 As Variant
    Dim intI As Integer

    RW = ThisWorkbook.Sheets("IgangvSpec").Range("R65536").End(xlUp).Row
    Data1 = ThisWorkbook.Sheets("IgangvSpec").Range("S5:T" & RW)
    For intI = 5 To UBound(Data1)
        If Data1(intI, 1) = "X" Then
            ThisWorkbook.Sheets("2008").Range("F" & Data1(intI,2)) = "ja"
        End If
    Next intI
End Sub
Avatar billede kabbak Professor
12. oktober 2008 - 09:25 #12
Der var en smutter ;-))


Sub Spec_retur()
    Dim RW As Long, Data1 As Variant
    Dim intI As Integer

    RW = ThisWorkbook.Sheets("IgangvSpec").Range("R65536").End(xlUp).Row
    Data1 = ThisWorkbook.Sheets("IgangvSpec").Range("S5:T" & RW)
    For intI = 1 To UBound(Data1)
        If Data1(intI, 1) = "X" Then
            ThisWorkbook.Sheets("2008").Range("F" & Data1(intI,2)) = "ja"
        End If
    Next intI
End Sub
Avatar billede kabbak Professor
12. oktober 2008 - 09:26 #13
Der var en smutter mere;-))


Sub Spec_retur()
    Dim RW As Long, Data1 As Variant
    Dim intI As Integer

    RW = ThisWorkbook.Sheets("IgangvSpec").Range("S65536").End(xlUp).Row
    Data1 = ThisWorkbook.Sheets("IgangvSpec").Range("S5:T" & RW)
    For intI = 1 To UBound(Data1)
        If Data1(intI, 1) = "X" Then
            ThisWorkbook.Sheets("2008").Range("F" & Data1(intI,2)) = "ja"
        End If
    Next intI
End Sub
Avatar billede kabbak Professor
12. oktober 2008 - 09:31 #14
Forklaring:

Finder den nederste celle med x i, med koden:
RW = ThisWorkbook.Sheets("IgangvSpec").Range("S65536").End(xlUp).Row

Sætter kolonne S og T i et array med:
Data1 = ThisWorkbook.Sheets("IgangvSpec").Range("S5:T" & RW)

looper igennem arrayet med:
For intI = 1 To UBound(Data1)

Tjekker arrayet (Data1) for X i kolonne 1(= S kolonnen) med:
    If Data1(intI, 1) = "X" Then

Skriver i Sheets("2008") F kolonnen med:
  ThisWorkbook.Sheets("2008").Range("F" & Data1(intI,2)) = "ja"
Avatar billede kabbak Professor
12. oktober 2008 - 09:35 #15
Jeg skal ikke have point, for det jeg skrev, men det med at bruge Array og finde den sidste celle med data i, er et must, for at speede koden op.
Se Bak's artikel her http://www.eksperten.dk/artikler/522
Avatar billede excelent Ekspert
12. oktober 2008 - 10:40 #16
Kan ikke måle hvilken der er hurtigst, men begge er da vist en forbedring :-)

Sub Spec_Tilbage()
Application.ScreenUpdating = False
Set shspec = ThisWorkbook.Sheets("IgangvSpec")
Set sh2008 = ThisWorkbook.Sheets("2008")
rk = 4
x = Application.CountIf(shspec.Range("S5:S25000"), "X")

For t = 1 To x
  rk1 = shspec.Range("S" & rk & ":S25000").Find("X", LookIn:=xlValues).Row
    rk = rk1
  sh2008.Cells(shspec.Cells(rk, "T"), "F") = "ja"
Next

Application.ScreenUpdating = True
End Sub
Avatar billede mrkr Juniormester
12. oktober 2008 - 16:57 #17
Mange tak for de forskellige inputs, ikke mindst forklaringen omkring arrays

Jeg har testet begge løsninger og de gør det faktisk lige hurtigt.
Det tager dog stadig en del tid, når der kommer 10 - 20 poster der skal sættes til nej.

Jeg har sendt mit ark til excelent i håbet om at mit ark med de faktiske poster kan visualisere mit problem bedre end jeg har kunnet forklare.

Jeg har nemlig den opfattelse af at koden burde kunne gøre det i et snuptag, hvis bare jeg kunne forklare problemet helt korrekt.

håber at vi finder en hurtigere løsning :-)
Avatar billede mrkr Juniormester
12. oktober 2008 - 19:33 #18
ja, det viser sig jo så at begge jeres koder er lynhurtige.
Grunden til at det tager rimelige lang tid er at jeg har nogle meget tunge formler som kører imens koden køres.
Så snart at beregningen blive sat til MANUEL. Er alt som det skal være.....
Tak for tippet Excelent :-)

Jeg beklager at jeg har lavet sådan en tanketorsk....

Så skal der bare uddeles en tak for hjælpen og points.


Og så lige et lille ting jeg er kommet til at tænke på efter kabbaks indlæg med arrays.
Kan den første kode (se nedenfor) evt.kunne gøres hurtigere ved at inlæse i arrays?



Sub IgangvSpec_hent_åbne_poster()
Application.ScreenUpdating = False
Application.Calculation = xlManual
    Dim intI As Integer
    Dim intJ As Integer
   
    Sheets("IgangvSpec").Select
    Range("A2:U200").Clear
    Sheets("2008").Range("S:S").Clear

    intJ = 5
    Do Until (ThisWorkbook.Sheets("IgangvSpec").Cells.Range("B" & intJ) = "")
        intJ = intJ + 1
    Loop

    For intI = 5 To 25000
        If (ThisWorkbook.Sheets("2008").Cells.Range("B" & intI) = ThisWorkbook.Sheets("faktura").Range("faktura_kundenr") _
            And ThisWorkbook.Sheets("2008").Cells.Range("F" & intI) <> "Ja") Then
            ThisWorkbook.Sheets("2008").Cells.Range("S" & intI) = intI
            ThisWorkbook.Sheets("2008").Cells.Range("A" & intI & ":T" & intI).Copy ThisWorkbook.Sheets("IgangvSpec").Range("A" & intJ)
            ThisWorkbook.Sheets("2008").Cells.Range("S" & intI) = intI
            ThisWorkbook.Sheets("IgangvSpec").Range("T" & intJ) = True
            intJ = intJ + 1
        End If
    Next intI
   
    Sheets("IgangvSpec").Range("igangv_nu") = Now
    Sheets("IgangvSpec").Range("igangv_kunde") = Sheets("faktura").Range("faktura_kundenr")
   
    Range("a5").Select
Application.Calculation = xlAutomatic
Application.ScreenUpdating = True
End Sub
Avatar billede mrkr Juniormester
12. oktober 2008 - 19:38 #19
og der fik jeg så sat den forkerte kode ind..... flot :-(

Sub IgangvSpec_hent_åbne_poster2()
    Dim intI As Integer
    Dim intJ As Integer
   
    Application.ScreenUpdating = False
    Application.Calculation = xlManual
   
    Sheets("IgangvSpec").Select
    Range("A2:U200").Clear
    Sheets("2008").Range("T:T").Clear

    Set shspec = ThisWorkbook.Sheets("IgangvSpec")
    Set sh2008 = ThisWorkbook.Sheets("2008")
    Set shFak = ThisWorkbook.Sheets("faktura")
   
    intJ = 5
    Do Until (shspec.Cells.Range("B" & intJ) = "")
        intJ = intJ + 1
    Loop

    For intI = 5 To 25000
        If sh2008.Cells.Range("B" & intI) = shFak.Range("faktura_kundenr") And sh2008.Cells.Range("F" & intI) <> "Ja" Then
            ThisWorkbook.Sheets("2008").Cells.Range("S" & intI) = intI
            sh2008.Range("T" & intI) = intI
            sh2008.Cells.Range("A" & intI & ":T" & intI).Copy shspec.Range("A" & intJ)
            shspec.Range("S" & intJ) = "X"
            intJ = intJ + 1
        End If
    Next intI
   
    Application.Calculation = xlAutomatic
    Application.ScreenUpdating = True
   
End Sub
Avatar billede mrkr Juniormester
13. oktober 2008 - 23:08 #20
Skal vi se at få lukket dette spørgsmål :-)
Jeg takker mange gange for indsatsen og beklager igen at jeg havde hoved under armen på et tidspunkt :-)
Avatar billede excelent Ekspert
15. oktober 2008 - 19:46 #21
velbekom
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
Kategori
Excel kurser for alle niveauer og behov – find det kursus, der passer til dig

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