Avatar billede jonasboege Praktikant
05. maj 2009 - 13:59 Der er 17 kommentarer og
1 løsning

Range, sheets, cells - mangler grundlæggende viden :-(

Hej.

Jeg har desværre ikke lært VBA fra bunden - og mangler derfor nok lidt grundlæggende forståelse - alligevel kan jeg nu godt lave nogle "sjove" programmer - af og til må jeg bare gå nogle omveje...

Her mener jeg indholdet i for-løkken bør kunne skrives på to linier (måske én) - uden at aktivere eller "selecte" noget.

Jeg kan bare ikke...

Hvordan skrives det mest simpelt, at noget fra ét ark i en fil skal kopieres over til et andet ark i en anden fil.

For a = 1 To 45
        kolonne = Int(kolonnerSkalSkiftes(a - 1))
        Workbooks(scriptfilnavn).Activate
        Sheets(ark).Select
        Range(Cells(1, kolonne), Cells(367, kolonne)).Copy
        Workbooks(ddatafilnavn).Activate
        Sheets(1).Cells(1, kolonne).Select
        ActiveSheet.Paste
    Next
Avatar billede rexden1 Nybegynder
05. maj 2009 - 14:18 #1
Du kan "koge" din kode ned til følgende 4 linjer

Fra Workbooks til paste er det en linje, husk mellemrummene.

For a = 1 To 45
        kolonne = Int(kolonnerSkalSkiftes(a - 1))
       
Workbooks(scriptfilnavn).Sheets(ark).Range(Cells(1, kolonne), Cells(367, kolonne)).Copy Destination:=Workbooks(ddatafilnavn).Sheets(1).Cells(1, kolonne).Paste

Next
Avatar billede jonasboege Praktikant
05. maj 2009 - 14:33 #2
Jeg kan ikke få det til at virke :-(
Jeg har husket mellemrummene...
Avatar billede jonasboege Praktikant
05. maj 2009 - 14:39 #3
Jeg satte helt præcis dette ind i stedet for mit gamle fra 1. workbooks til paste:

Workbooks(scriptfilnavn).Sheets(ark).Range(Cells(1, kolonne), Cells(367, kolonne)).Copy Destination:=Workbooks(ddatafilnavn).Sheets(1).Cells(1, kolonne).Paste

Det virker når jeg gør det på den gamle måde...
Avatar billede rexden1 Nybegynder
05. maj 2009 - 14:39 #4
Hvilke fejl kommer den med ?
Avatar billede jonasboege Praktikant
05. maj 2009 - 14:41 #5
Run-time error '438':

Object doesn't support this property or method
Avatar billede rexden1 Nybegynder
05. maj 2009 - 14:52 #6
prøv at sætte den her kode ind:

Workbooks("scriptfilnavn").Sheets("ark").Range(Cells(1, kolonne), Cells(367, kolonne)).Copy Destination:=Workbooks("ddatafilnavn").Sheets(1).Cells(1, kolonne)
Avatar billede kabbak Professor
05. maj 2009 - 14:53 #7
Husk at der ikke er en kolonne 0 i excel.

Det jeg skriver her, er vel hvad der ønskes.

Workbooks(FRAfilnavn).Sheets(ark).Range(Cells(1, 1), Cells(367, 45)).Copy Workbooks(TILfilnavn).Sheets(1).Cells(1, 1)
Avatar billede jonasboege Praktikant
05. maj 2009 - 15:17 #8
Nej - virker ikke.
Det har ikke noget med kolonne 0 at gøre. Array indeholder i første omgang talværdien 4 :-)
I første omgang skrev du paste til sidst og det gjorde du ikke før - så den har jeg forsøgt at fjerne - det virkede heller ikke.
Jeg kan ikke bruge anførselstegn, da scriptfilnavn, ark osv. er variabler...
Jeg er før stødt på problemer, når jeg blander range sammen med filnavne og ark... er du sikker på, man kan gøre det?
Avatar billede jonasboege Praktikant
11. maj 2009 - 13:21 #9
Hej kabbak.
Tak for svar. Det er 45 forskellige kolonner (fra række 1 til 367), jeg skal kopiere. Jeg har oven over koden i array kolonnerSkalSkiftes() skrevet de kolonner, der skal kopieres.
Det virker fint med min egen kode, så jeg fatter ikke hvorfor det ikke virker, når jeg bruger "den forkortede":

Workbooks(scriptfilnavn).Sheets(ark).Range(Cells(1, kolonne), Cells(367, kolonne)).Copy Workbooks(ddatafilnavn).Sheets(1).Cells(1, kolonne)

eller

Workbooks(scriptfilnavn).Sheets(ark).Range(Cells(1, kolonne), Cells(367, kolonne)).Copy java script:%20void(0);Destination:=Workbooks(ddatafilnavn).Sheets(1).Cells(1, kolonne)

Når jeg efterfølgende går ind i debug - og holder musen hen over variablerne, så er de helt korrekte (jf. min overbevisning)
Avatar billede kabbak Professor
11. maj 2009 - 22:28 #10
Ok prøv dette

Public Sub test()
Dim Ark As String, ScriptFilnavn As String, DdataFilnavn As String, A As Integer
Dim kolonnerSkalSkiftes() As Variant, Kolonne
'Jeg ved ikke om du bruger bogstaver eller tal i kolonne, der for er der ikke skrevet Integer eller string
Ark = "Ark1" ' ret til dit ark
ScriptFilnavn = "Mappe1.xls" ' mappen der kopieres fra, den SKAL være åben før koden køres
DdataFilnavn = ThisWorkbook.Name ' navnet på den mappe koden er i og som der kopieres til
For A = 1 To 45
        Kolonne = Int(kolonnerSkalSkiftes(A - 1))
        Workbooks(ScriptFilnavn).Sheets(Ark).Range(Cells(1, Kolonne), Cells(367, Kolonne)).Copy _
        Workbooks(DdataFilnavn).Sheets(1).Cells(1, Kolonne)
    Next
End Sub
Avatar billede jonasboege Praktikant
12. maj 2009 - 09:41 #11
Hej kabbak.
Tak for svar. Men det virker bare ikke :-(
Fejlen er nu:
Rund-time error '1004':
Application-defined or object-defined error

Kolonne er tal.

Det mærkelige - som jeg ser det - er jo, at det virker fint, når jeg skriver koden

Workbooks(ScriptFilnavn).Activate
Sheets(Ark).Select
Range(Cells(1, Kolonne), Cells(367, Kolonne)).Copy
Workbooks(DdataFilnavn).Activate
Sheets(1).Cells(1, Kolonne).Select
ActiveSheet.Paste

Og de samme variabler bruges jo...

Nå - jeg ved ikke om det kan lade sig gøre at finde fejlen - jeg er ved at give op :-(
Avatar billede oyejo Nybegynder
12. maj 2009 - 19:01 #12
Hva med denne?

For A = 1 To 45
       
Kolonne = Int(kolonnerSkalSkiftes(A - 1))
       
Workbooks(DdataFilnavn).Worksheets(1).Range(Cells(1, Kolonne), Cells(367, Kolonne)).Value = _
Workbooks(ScriptFilnavn).Worksheets(Ark).Range(Cells(1, Kolonne), Cells(367, Kolonne)).Value

Next
End Sub
Avatar billede oyejo Nybegynder
12. maj 2009 - 19:29 #13
Eller denne?

For A = 1 To 45
     
Kolonne = Int(kolonnerSkalSkiftes(A - 1))
     
Workbooks(DdataFilnavn).Worksheets(1).Cells(1, Kolonne).Resize(367, 1).Value = _
Workbooks(ScriptFilnavn).Worksheets(Ark).Cells(1, Kolonne).Resize(367, 1).Value

Next
End Sub
Avatar billede jonasboege Praktikant
13. maj 2009 - 09:46 #14
Det er bare løgn - den sidste "virker" - dog er det alle formlerne i kolonner fra filen ScriptFilnavn, jeg skal bruge - og det kan jeg ikke lige finde ud af med alt det der resize :-(

Din første løsning, oyejo virker heller ikke...

Det er meget mærkeligt. Alle jeres forslag virker altså fint, når jeg forsøger i to nye filer... bare ikke disse to! Meget mærkeligt, synes jeg.
Avatar billede oyejo Nybegynder
13. maj 2009 - 10:08 #15
Det var da leit å høre om all løgn ;-)
Mine to innlegg skal gjøre nøyaktig det samme, bare skrevet på forskjellig måte.

Hvis det er formlene du skal ha, kan du prøve denne.
(jeg gir ingen garantier ;-)

Resize utvider "ranget" fra angitt celle med antall rader og kollonner. En ganske kjekk sak.


For A = 1 To 45
     
Kolonne = Int(kolonnerSkalSkiftes(A - 1))
     
Workbooks(DdataFilnavn).Worksheets(1).Cells(1, Kolonne).Resize(367, 1).Formula = _
Workbooks(ScriptFilnavn).Worksheets(Ark).Cells(1, Kolonne).Resize(367, 1).Formula

Next
End Sub
Avatar billede jonasboege Praktikant
13. maj 2009 - 10:11 #16
Aha... Nu tror jeg, at jeg har fundet ud af, hvad der skal til, men vil gerne have jeres kommentar på det.

For at linien virker SKAL FRAfilen være aktiv, ikke?
Og det ark, der skal kopieres fra skal være selected, ikke?

Hvis dette er sandt, kan der så på en linie både aktiveres filen og vælge arket?
Avatar billede kabbak Professor
13. maj 2009 - 11:52 #17
Begge filer skal være åbnet, det er korrekt, men i min kode er de ikke nødvendig at aktivere til arket.

det skrev jeg også i koden man. d. 11. maj 2009 kl. 22:28:05
Avatar billede jonasboege Praktikant
13. maj 2009 - 12:53 #18
Hej.

Jeg var med på, at filerne skal være åbne - men i min kode skal filen aktiveres først... sjovt.

Nå - måske bliver jeg klogere en anden gang - rexdent løsning kom først, så han får point - men tak til jer alle!

Jonas
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
Kurser inden for grundlæggende programmering

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