Avatar billede Daffodil Professor
09. maj 2017 - 10:37 Der er 6 kommentarer og
2 løsninger

Kopi af celleindhold via VBA

Hej
Jeg sidder med et regneark på ca. 200.000 linjer, hvor jeg via to parametre skal kopiere en celles indhold til en anden celle.

Jeg har lavet følgende VBA kode, men den er rigtig langsom og jeg er lidt på bar bund med hensyn til kopiering til memory og lave det der.

WBL = ActiveSheet.UsedRange.Rows.Count

For a = 1 to WBL

If Cells(a, 4).Value = "S" And Cells(a + 1, 4).Value = "C" Then
Cells(a + 1, 8).Select
Selection.Copy
Cells(a, 43).Select
Selection.Insert
End If

Next a

Jeg har prøvet at slå skærmopdatering fra, men det giver ikke hurtigere gennemløbstid. Formlen jeg har lavet er over 1 time om gennemløbet.

Nogen der har et godt bud på hvorledes jeg optimere dette.
Avatar billede kabbak Professor
09. maj 2017 - 11:06 #1
WBL = ActiveSheet.UsedRange.Rows.Count

For a = 1 To WBL

If Cells(a, 4).Value = "S" And Cells(a + 1, 4).Value = "C" Then
Cells(a + 1, 8).Copy Cells(a, 43)
End If

Next a
Avatar billede Daffodil Professor
09. maj 2017 - 11:56 #2
Det virker og kører hurtigt.

Mange tak for hjælpen.
Avatar billede Jan Hansen Ekspert
09. maj 2017 - 11:57 #3
måske:
Dim WBL as Long
WBL = ActiveSheet.UsedRange.Rows.Count

For a = 1 To WBL

If Cells(a, 4).Value = "S" And Cells(a + 1, 4).Value = "C" Then
Cells(a, 43) = Cells(a + 1, 8)
End If

Next a

ej testet
Mvh Jan
Avatar billede Daffodil Professor
09. maj 2017 - 12:12 #4
Begge løsning bruger 30 sekunder til gennemløbet af ca. 200.000 linjer, så Dim WBL as Long har ingen effekt på koden.
Avatar billede kabbak Professor
09. maj 2017 - 14:27 #5
Prøv at teste denne, den overfører kun værdier, ikke formater.

Den burde være hurtiger. ;-)

Public Sub Test()
    Dim IndData As Variant, UdData As Variant, A As Long, WBL As Long
    WBL = ActiveSheet.UsedRange.Rows.Count
    IndData = Range(Cells(1, 1), Cells(WBL, 8))
    UdData = Range(Cells(1, 43), Cells(WBL, 43))
    For A = 1 To UBound(IndData, 1) - 1
        If IndData(A, 4) = "S" And IndData(A + 1, 4) = "C" Then
            UdData(A, 1) = IndData(A + 1, 8)
        End If

    Next A
    Range(Cells(1, 43), Cells(WBL, 43)) = UdData
End Sub
Avatar billede Daffodil Professor
11. maj 2017 - 08:03 #6
Hurtig er vist ikke ordet.

Den brugte under 1 sekund på gennemløbet.

Af det her kan jeg se at jeg har meget at lære om VBA. Nu vil jeg forsøge at gennemskue hvad denne program stump gør. Jeg har en udfordring med hvorfor inddata har defineret range fra celle 1,1.

Mange tak for hjælpen
Avatar billede kabbak Professor
11. maj 2017 - 10:47 #7
"defineret range fra celle 1,1"

i dit tilfælde kunne det også være

IndData = Range(Cells(1, 4), Cells(WBL, 8))
men så skal du også lave om i

  If IndData(A, 1) = "S" And IndData(A + 1,1) = "C" Then
            UdData(A, 1) = IndData(A + 1,4)
Avatar billede kabbak Professor
11. maj 2017 - 10:49 #8
UdData(A, 1) = IndData(A + 1,5)

skal det være
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