Avatar billede Mathias- Nybegynder
28. januar 2012 - 14:25 Der er 17 kommentarer og
1 løsning

kopiere ikke tomme celler

Har lidt problemer med en makro.

Den skal kunne checke om en celle indeholder karakterer, altså er <> "".
Hvis den indeholder karakterer, så skal den kopiere cellen til et andet ark.

Det drejer sig om kolonne B og C, række 3 til 17, række 20 til 34, række 37 til 51, række 54 til 68, række 71 til 85, række 88 til 102, række 105 til 120

Eksempel:

Ark1:

B3 = ""
B4 = ""
B4 = test
B5 = ""
B6 = test2

C3 = ""
C4 = ""
C4 = 1
C5 = ""
C6 = 2

Den skal kopiere B4 til "ark2" B2
Den skal kopiere C6 til "ark2" B3 (altså den næste under)
(der vil aldrig stå tal i kolonne C hvis kolonne B, samme række er tom)

Den skal desuden tage cellen ved siden af og kopiere, så:

"ark2" B2 = test, C2 = 1
"ark2" B3 = test2, C3 = 2


Række 3 til 17 har en overskrift:
Denne overskrift skal med hvis der mellem række 3 og 17 i kolonne B og C er karakterer.
overskriften skal stå et felt til venstre for første overførte 'navn'

Eksempel:

"ark2" B2 = test, C2 = 1
"ark2" B3 = test2, C3 = 2

Her skal overskriften være i A2.

Når 3 til 17 er tjekket, så skal 20 til 34 tjekkes. Her skal ske det samme, men inden da, skal der være en tom række.

Dvs.:

"ark2" A2 = overskrift
"ark2" B2 = test, C2 = 1
"ark2" B3 = test2, C3 = 2
TOM RÆKKE --------------------
gør nu det samme for 3 til 17.

Overskifterne, som skal hentes står i henholdsvis kolonne A, række  3, 20 37, 54, 71, 88, 105

Skriv endelig hvis I vil vide mere.
Avatar billede Thorp Praktikant
28. januar 2012 - 17:03 #1
Se denne VBA kode - ikke den mest elegante med den løser din opgave:

Sub Copy_Records()

Dim i As Integer, j As Integer, k As Integer
Dim MyRange As Range, MyArea As Range
Dim C As Variant

Set Area_1 = Range("B3:B17")
Set Area_2 = Range("B20:B34")
Set Area_3 = Range("B37:B51")
Set Area_4 = Range("B54:B68")
Set Area_5 = Range("B71:B85")
Set Area_6 = Range("B88:B102")
Set Area_7 = Range("B105:B120")


'Stop
    j = 0
    'Gennemløber alle områder
   
    Application.ScreenUpdating = False
   
    For i = 1 To 7
       
        Select Case i
       
        Case 1
            Set MyArea = Area_1
        Case 2
            Set MyArea = Area_2
        Case 3
            Set MyArea = Area_3
        Case 4
            Set MyArea = Area_4
        Case 5
            Set MyArea = Area_5
        Case 6
            Set MyArea = Area_6
        Case 7
            Set MyArea = Area_7
       
        End Select
       
                     
        Set MyRange = MyArea
        k = 0
       
        For Each C In MyRange
            If Not (IsEmpty(C)) Then
                If k = 0 Then
                    j = j + 1
                    MyRange.Offset(-1, 0).Resize(1, 1).Copy
                    Sheets("Ark5").Range("A2").Offset(j, 0).PasteSpecial
                End If
                C.Copy
                Sheets("Ark5").Range("B2").Offset(j, 0).PasteSpecial
                C.Offset(0, 1).Copy
                Sheets("Ark5").Range("C2").Offset(j, 0).PasteSpecial
                j = j + 1
                k = k + 1
            End If
           
        Next C
       
    Next i
   
    Application.ScreenUpdating = True


End Sub
Avatar billede Mathias- Nybegynder
28. januar 2012 - 18:00 #2
Hej Thorp,

Glimrende!

Det eneste der mangler overskriften - den kommer ikke med. Hvis det er muligt vil jeg også gerne have underoverskriften overført.

Underoverskriften ligger i cellen under overskriften.

Og lige en sidste ting, hvis du har mod på det:
Jeg kunne godt tænkte mig, at denne denne macro blev kørt på 7 ark, sådan at det hele kom til at stå under hinanden.

I cellen over 'overskriften' skal arknavnet så indsættes.

Jeg sætter pris på din hjælp!
vh
Mathias
Avatar billede Thorp Praktikant
28. januar 2012 - 19:47 #3
Hvor står din overskrift - jeg har antaget at den står i Kolonne B2, B19 .......
Avatar billede Mathias- Nybegynder
28. januar 2012 - 19:54 #4
Den står i A3, A20, A37, A54, A71, A88, A105
Avatar billede Thorp Praktikant
28. januar 2012 - 20:09 #5
Dette burde klare første del af dit spørgsmål

Sub Copy_Records()

Dim i As Integer, j As Integer, k As Integer, n As Integer
Dim MyRange As Range, MyArea As Range
Dim C As Variant

Set Area_1 = Range("B3:B17")
Set Area_2 = Range("B20:B34")
Set Area_3 = Range("B37:B51")
Set Area_4 = Range("B54:B68")
Set Area_5 = Range("B71:B85")
Set Area_6 = Range("B88:B102")
Set Area_7 = Range("B105:B120")



    j = 0
    'Gennemløber alle områder
   
    Application.ScreenUpdating = False
   
    For i = 1 To 7
       
        Select Case i
       
        Case 1
            Set MyArea = Area_1
        Case 2
            Set MyArea = Area_2
        Case 3
            Set MyArea = Area_3
        Case 4
            Set MyArea = Area_4
        Case 5
            Set MyArea = Area_5
        Case 6
            Set MyArea = Area_6
        Case 7
            Set MyArea = Area_7
       
        End Select
       
                     
        Set MyRange = MyArea
        k = 0
       
        For Each C In MyRange
            If Not (IsEmpty(C)) Then
                If k = 0 Then
                    j = j + 1
                    MyRange.Offset(0, -1).Resize(1, 1).Copy
                    Sheets("Ark5").Range("A2").Offset(j, 0).PasteSpecial
                    MyRange.Offset(1, -1).Resize(1, 1).Copy
                    Sheets("Ark5").Range("A2").Offset(j + 1, 0).PasteSpecial
                End If
                C.Copy
                Sheets("Ark2").Range("B2").Offset(j, 0).PasteSpecial
                C.Offset(0, 1).Copy
                Sheets("Ark5").Range("C2").Offset(j, 0).PasteSpecial
                j = j + 1
                k = k + 1
            End If
           
        Next C
       
    Next i
   
    Application.ScreenUpdating = True

End Sub
Avatar billede Thorp Praktikant
28. januar 2012 - 20:10 #6
Sheets("Ark5").Range("B2").Offset(j, 0).PasteSpecial
Avatar billede Mathias- Nybegynder
28. januar 2012 - 20:28 #7
Det virker nøjagtig efter hensigten, mange tak!
Hvis du også har mod på anden del, vil jeg være glad :D
Avatar billede Thorp Praktikant
28. januar 2012 - 20:40 #8
Dette skulle gerne løse din anden opgave :-)

Public j As Integer

Sub Copy_Sheets()

Dim n As Integer
Dim Sheet_Name As String

Application.ScreenUpdating = False

j = 0

For n = 0 To 6

    Select Case n
   
        Case 0
            Sheet_Name = "Ark1"
            Copy_Records Sheet_Name
        Case 1
            Sheet_Name = "Ark2"
            Copy_Records Sheet_Name
        Case 2
            Sheet_Name = "Ark3"
            Copy_Records Sheet_Name
        Case 3
            Sheet_Name = "Ark4"
            Copy_Records Sheet_Name
        Case 4
            Sheet_Name = "Ark5"
            Copy_Records Sheet_Name
        Case 5
            Sheet_Name = "Ark6"
            Copy_Records Sheet_Name
        Case 6
            Sheet_Name = "Ark7"
            Copy_Records Sheet_Name
    End Select

Next n

Application.ScreenUpdating = True

End Sub

Sub Copy_Records(SheetName As String)

Dim i As Integer, k As Integer
Dim MyRange As Range, MyArea As Range
Dim C As Variant

Set Area_1 = Sheets(SheetName).Range("B3:B17")
Set Area_2 = Sheets(SheetName).Range("B20:B34")
Set Area_3 = Sheets(SheetName).Range("B37:B51")
Set Area_4 = Sheets(SheetName).Range("B54:B68")
Set Area_5 = Sheets(SheetName).Range("B71:B85")
Set Area_6 = Sheets(SheetName).Range("B88:B102")
Set Area_7 = Sheets(SheetName).Range("B105:B120")



    'j = 0
    'Gennemløber alle områder
   
   
    For i = 1 To 7
       
        Select Case i
       
        Case 1
            Set MyArea = Area_1
        Case 2
            Set MyArea = Area_2
        Case 3
            Set MyArea = Area_3
        Case 4
            Set MyArea = Area_4
        Case 5
            Set MyArea = Area_5
        Case 6
            Set MyArea = Area_6
        Case 7
            Set MyArea = Area_7
       
        End Select
       
       
        Set MyRange = MyArea
        k = 0
       
        For Each C In MyRange
            If Not (IsEmpty(C)) Then
                If k = 0 Then
                    j = j + 1
                    Sheets("Ark8").Range("A2").Offset(j - 1, 0) = SheetName
                    MyRange.Offset(0, -1).Resize(1, 1).Copy
                    Sheets("Ark8").Range("A2").Offset(j, 0).PasteSpecial
                    MyRange.Offset(1, -1).Resize(1, 1).Copy
                    Sheets("Ark8").Range("A2").Offset(j + 1, 0).PasteSpecial
                End If
                C.Copy
                Sheets("Ark8").Range("B2").Offset(j, 0).PasteSpecial
                C.Offset(0, 1).Copy
                Sheets("Ark8").Range("C2").Offset(j, 0).PasteSpecial
                j = j + 1
                k = k + 1
            End If
           
        Next C
       
    Next i
   

End Sub
Avatar billede Mathias- Nybegynder
28. januar 2012 - 21:06 #9
Fremragende, det eneste lille problem der er, er at underoverskriften nogle stedet bliver overskrevet med arknavnet.

Det sker de steder, hvor der kun er en værdi i kolonne B. Hvis der er mere end en værdi sker det ikke.

Hvis det ikke er besværligt, må den gerne indsætte en tom række over alle arknavnene, så der lige bliver lidt rum imellem :-)
Avatar billede Thorp Praktikant
28. januar 2012 - 21:13 #10
Du skriver bare J+2 her i koden:

                If k = 0 Then
                    j = j + 2
                    Sheets("Ark8").Range("A2").Offset(j - 1, 0) = SheetName
                    MyRange.Offset(0, -1).Resize(1, 1).Copy
                    Sheets("Ark8").Range("A2").Offset(j, 0).PasteSpecial
                    MyRange.Offset(1, -1).Resize(1, 1).Copy
                    Sheets("Ark8").Range("A2").Offset(j + 1, 0).PasteSpecial
                End If
Avatar billede Mathias- Nybegynder
28. januar 2012 - 21:16 #11
Tak, og hvad med underoverskrifterne? :-)
Avatar billede Mathias- Nybegynder
28. januar 2012 - 21:31 #12
Det kunne måske løses ved, hvis der kun er en værdi i række B, så indsæt en ekstra linje altså j+3.
Avatar billede Thorp Praktikant
28. januar 2012 - 21:38 #13
Jeg har testet koden og underoverskrifterne kommer fint med selv om der kun er en linje med data.

Jeg har antaget at Underoverskrifterne er i A4, A21 ......
Avatar billede Mathias- Nybegynder
28. januar 2012 - 21:43 #14
Ja det er korrekt antaget, men læg mærke til at der er en forskel i antal tomme rækker over arknavnene.

Hvis der er én værdi i kolonne B, så kommer der 0 rækker over arknavnet.

Hvis der er 2 værdier i kolonne B, så kommer der 1 række over arknavnet.
Avatar billede Thorp Praktikant
28. januar 2012 - 21:52 #15
Mit testresultat ser således ud:

Ark1       
Overskrift1            test3    658
Underoverskrift1       
Ark1       
Overskrift1            test5    6547
Underoverskrift5    test6    6487
                              test7    6427
                              test8    6367
Avatar billede Mathias- Nybegynder
28. januar 2012 - 22:00 #16
Ja, sådan ser min også ud.
-Det jeg godt kunne tænke mig var så, at der over ark1 var et linjeskift. :-)
Avatar billede Thorp Praktikant
28. januar 2012 - 22:15 #17
Denne modifikation burde klare det

Public j As Integer
Public k As Integer

Sub Copy_Sheets()

Dim n As Integer
Dim Sheet_Name As String

Application.ScreenUpdating = False

j = 0

For n = 0 To 6

    Select Case n
   
        Case 0
            Sheet_Name = "Ark1"
            Copy_Records Sheet_Name
            If k = 1 Then j = j + 1
        Case 1
            Sheet_Name = "Ark2"
            Copy_Records Sheet_Name
            If k = 1 Then j = j + 1
        Case 2
            Sheet_Name = "Ark3"
            Copy_Records Sheet_Name
            If k = 1 Then j = j + 1
        Case 3
            Sheet_Name = "Ark4"
            Copy_Records Sheet_Name
            If k = 1 Then j = j + 1
        Case 4
            Sheet_Name = "Ark5"
            Copy_Records Sheet_Name
            If k = 1 Then j = j + 1
        Case 5
            Sheet_Name = "Ark6"
            Copy_Records Sheet_Name
            If k = 1 Then j = j + 1
        Case 6
            Sheet_Name = "Ark7"
            Copy_Records Sheet_Name
    End Select

Next n

Application.ScreenUpdating = True

End Sub

Sub Copy_Records(SheetName As String)

Dim i As Integer
Dim MyRange As Range, MyArea As Range
Dim C As Variant

Set Area_1 = Sheets(SheetName).Range("B3:B17")
Set Area_2 = Sheets(SheetName).Range("B20:B34")
Set Area_3 = Sheets(SheetName).Range("B37:B51")
Set Area_4 = Sheets(SheetName).Range("B54:B68")
Set Area_5 = Sheets(SheetName).Range("B71:B85")
Set Area_6 = Sheets(SheetName).Range("B88:B102")
Set Area_7 = Sheets(SheetName).Range("B105:B120")



    'j = 0
    'Gennemløber alle områder
   
   
    For i = 1 To 7
       
        Select Case i
       
        Case 1
            Set MyArea = Area_1
           
        Case 2
            Set MyArea = Area_2
            If k = 1 Then j = j + 1
        Case 3
            Set MyArea = Area_3
            If k = 1 Then j = j + 1
        Case 4
            Set MyArea = Area_4
            If k = 1 Then j = j + 1
        Case 5
            Set MyArea = Area_5
            If k = 1 Then j = j + 1
        Case 6
            Set MyArea = Area_6
            If k = 1 Then j = j + 1
        Case 7
            Set MyArea = Area_7
        End Select
       
       
        Set MyRange = MyArea
        k = 0
       
        For Each C In MyRange
            If Not (IsEmpty(C)) Then
                If k = 0 Then
                    j = j + 2
                    Sheets("Ark8").Range("A2").Offset(j - 1, 0) = SheetName
                    MyRange.Offset(0, -1).Resize(1, 1).Copy
                    Sheets("Ark8").Range("A2").Offset(j, 0).PasteSpecial
                    MyRange.Offset(1, -1).Resize(1, 1).Copy
                    Sheets("Ark8").Range("A2").Offset(j + 1, 0).PasteSpecial
                End If
                C.Copy
                Sheets("Ark8").Range("B2").Offset(j, 0).PasteSpecial
                C.Offset(0, 1).Copy
                Sheets("Ark8").Range("C2").Offset(j, 0).PasteSpecial
                j = j + 1
                k = k + 1
            End If
           
        Next C
       
    Next i
   

End Sub
Avatar billede Mathias- Nybegynder
28. januar 2012 - 22:19 #18
Well done.
Tak for hjælpen :-)
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