2012-04-19 6 views
5

Nonostante molti post che ho guardato attraverso la stessa frase della mia domanda, nessuna delle risposte soddisfa quello che sto cercando. Se riesci a collegarmi a uno, leggerei volentieri.VBA - Come copiare una riga in Excel da una cartella di lavoro a un'altra?

Ho una cartella di lavoro con fogli di lavoro. Per semplicità, diciamo che la mia cartella di lavoro ha un foglio di lavoro. E nel mio foglio di lavoro che si chiama "Foglio1", ci sono dati nelle celle da A1 a A4.

Quello che voglio il mio codice VBA da fare è:

  1. Copia riga 1 (o specificamente celle da A1 a A4) di cartella di lavoro 'A' nella variabile Gamma 'myRange'
  2. Creare una nuova cartella di lavoro, chiamiamo questa cartella di lavoro 'B'
  3. Dà alla cartella di lavoro 'default B "foglio1" un nuovo nome a "Nome test"
  4. Apri cartella di lavoro' B '(anche se mi rendo conto che il codice VBA "Workbooks.Add" apre una nuova prenota in modo che questo passaggio possa essere ridondante poiché Workbooks.Add copre la metà dei punti 2 e 3)
  5. Incolla "myRange" nella prima riga di "Workbook B"
  6. Salva "Cartella di lavoro B" con il nome "Test Book" e un timestamp racchiuso tra parentesi quadre. Il file deve essere anche l'estensione file "xls"
  7. Close 'Cartella di lavoro B' e riprendere a 'Cartella di lavoro A'

Quello che ho finora è questo:

Sub OpenAndSaveNewBook() 
    'Declarations 
    Dim MyBook As String 
    Dim MyRange As Range 
    Dim newBook As Workbook 

    'Get name of current wb 
    MyBook = ThisWorkbook.Name 
    Set MyRange = MyBook.Sheets("Sheet1").Range("A1,F1") 

    'Create/Open new wb 
    newBook = Workbooks.Add 

    'Save new wb with XLS extension 
    ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & "/" & "TEST-BOOK", _ 
          FileFormat:=xlNormal, CreateBackup:=False 

    '===NOTE: BEFORE THE FOLLOWING RUNS I NEED TO PERFORM ACTIONS ON CELLS VIA VBA ON 
    '===WORKBOOK 'A'. DOES THE NEWLY CREATE WORKBOOK BECOME THE PRIMARY/ACTIVE WORKBOOK 
    '===? AND SO THEN DO I NEED TO ACTIVATE WORKBOOK 'A'? 
    ActiveWorkbook.Close savechanges:=True 

    'Return focus to workbook 'a' 
    MyBook.Activate 
End Sub 

Come si può vedere, mi manca il codice che consente di gestire:

  • l'incollatura dei miei dati copiati nella nuova cartella di lavoro
  • il cambio della nuova Nome sheet1 della cartella di lavoro a qualcos'altro
  • l'aggiunta di un timestamp alla stringa di nome di file su Salva

Infine, ho inserito una domanda nel mio codice, come credo di avere un malinteso del metodo ActiveWorkbook. AFAIK quando viene eseguito il codice "Workbooks.Add", questo diventa Active Workbook, ovvero uno con lo stato attivo. Questo influenza il codice VBA in esecuzione sulla cartella di lavoro 'A'? Questo significa che se volessi aggiungere del codice per manipolare le celle della cartella di lavoro 'A', allora avrei bisogno di usare "MyBook.Activate" dove 'MyBook' contiene la stringa del titolo effettivo della cartella 'A'?

Qualsiasi aiuto sarà molto apprezzato.

Grazie, QF

risposta

9

Invece di copia incollando il modo in cui lei ha citato sopra, si può fare direttamente questo. Questo annullerà anche l'uso di una variabile.

MyBook.Sheets("Sheet1").Rows("1:4").copy _ 
newBook.Sheets("Sheet1").Rows("1") 

EDIT

Ho appena notato un errore con il codice.

newBook = Workbooks.Add 

Questa linea vi darà un errore, come è necessario utilizzare Set

Il codice può essere scritto come

Option Explicit 

Sub OpenAndSaveNewBook() 
    Dim MyBook As Workbook, newBook As Workbook 
    Dim FileNm As String 

    Set MyBook = ThisWorkbook 

    FileNm = ThisWorkbook.Path & "\" & "TEST-BOOK.xls" 
    Set newBook = Workbooks.Add 

    With newBook 
     MyBook.Sheets("Sheet1").Rows("1:4").Copy .Sheets("Sheet1").Rows("1") 

     'Save new wb with XLS extension 
     .SaveAs Filename:=FileNm, FileFormat:=xlNormal, CreateBackup:=False 

     .Close Savechanges:=False 
    End With 
End Sub 

altri Cambia

Sviluppando l'uso di SET

Ti consiglierei di vedere questo post.

LINK: Worksheets does not work

+0

Fare 'newBook.SaveAs' e' newBook.Close' pure. Come hai scoperto, può essere fonte di confusione sapere a cosa si riferisce ActiveWorkbook, quindi è meglio usare riferimenti espliciti laddove possibile. – e100

+0

Grazie per la risposta. Sono un principiante VBA e ricevo un messaggio di errore 'Qualifier Invalid' seguendo il tuo suggerimento. Immagino che questo sia dovuto al fatto che MyBook è del tipo sbagliato? Inoltre, questo non ha senso per me come dov'è il comando da incollare su newBook? Potresti elaborare? –

+0

@ e100: stavo modificando il mio post quando hai postato questo commento :) –

3

La cosa impressionante su Excel è la funzione 'Record Macro'. Ho iniziato la registrazione di una macro e solo seguito i passi che ha delineato, quindi fatto un paio di piccole modifiche al codice che Excel fornito come la macro registrata:

Range("A1:F1").Select 
Selection.Copy 
Workbooks.Add 
ActiveSheet.Paste 
Sheets("Sheet1").Name = "Test Name" 
Application.CutCopyMode = False 
myNewFileName = myPath & myTestName & "_" & Date & ".xls" 
ActiveWorkbook.SaveAs Filename:=myNewFileName _ 
    , FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False 

La funzione Date restituisce la data corrente del sistema. È importante notare che le parentesi quadre che si desideravano non sono caratteri di nome file validi; Excel genererà un errore se si tenta di utilizzarli.

+0

"... È importante notare che le parentesi quadre ... genereranno un errore se si tenta di utilizzarle." Non ne avevo idea. Molte grazie per la tua risposta. –

4

Evitare i riferimenti a ActiveWorkbook in favore di riferimenti espliciti laddove possibile.

Come hai notato, può essere difficile sapere cosa è attualmente attivo e non è necessario attivare una cartella di lavoro per manipolarla.

Quindi si dovrebbe utilizzare

newBook.SaveAs... 
newBook.Close... 

macro registrate tendono ad attivare le cartelle di lavoro, al fine di lavorare su di loro, ma questo è perché questo è il modo in cui un essere umano che li ha registrati funziona! Tutto ciò che l'attivazione fa davvero è cambiare focus.

Lo stesso vale per effettuare selezioni e quindi manipolare la selezione corrente; non è necessario in VBA e tende ad essere più lento della manipolazione diretta.

+0

Grazie per la chiarezza su ActiveWorkbook. –

1

Attiva i macro-registratori; eseguire con cura i passaggi che si desidera; ferma il registratore; "modifica" la macro generata. Correggere quando è necessario creare il programma che si desidera, ad es. Per parametrizzarlo.