Excel auto nuovo foglio con copia di colonna e data di oggi


0

Voglio scrivere una routine VBA che sarebbe "giornaliera"

  • crea un nuovo foglio
  • dai a quel nuovo foglio un nome del modulo GG.MM.AA (con zeri iniziali), in base alla data odierna (ad esempio, 25.07.18 )
  • copiare i valori dalle colonne A e B del mio DataInput foglio nel nuovo foglio.

Cosa intendo per "quotidiano"? Solo se l'ora corrente è = o & gt; un determinato orario, quindi creare il foglio, altrimenti ignorarlo.

Non penso sia difficile da gestire. Ho provato a combinare alcune formule per metterle insieme ma mi danno un errore tutto il tempo.

Stavo pensando a qualcosa

Option Explicit
Sub ReportSheet_Today()
    Dim szTodayDate As String

    szTodayDate = Format(Date, "dd.mm.yy")
    On Error GoTo MakeSheet
    Sheets(szTodayDate).Activate
    If Time < TimeValue("9:00:00") Then
        'MakeSheet:
        Sheets.Add , Worksheets(Worksheets.Count)
        ActiveSheet.Name = szTodayDate
        Sheets("DataInput").Select
        Range("A:A").Copy
        Sheets("szTodayDate").Select
        Range("A:A").Select
        ActiveSheet.Paste
    End IF
End Sub

Quindi su quale linea si trova l'errore? Qual è il messaggio di errore?
DavidPostill

@DavidPostill ignorando l'errore di compilazione dall'etichetta della linea commentata, che sarebbe l'errore di runtime 9 dal tentativo di dereferenziazione Sheets("szTodayDate"), che non esiste. L'OP deve rimuovere le virgolette che trasformano la loro variabile in una stringa letterale.
Mathieu Guindon

Dato che sono un novizio in vba, ed è un hobby per me imparare "coding" non riesco a vedere attraverso questi significati di variabile / stringa. Sapevo che c'era qualcosa di sbagliato qui ma non l'ho visto.
SarXes

Risposte:


0

L'errore è qui:

Sheets("szTodayDate").Select

szTodayDate non è il nome del foglio; è una variabile locale che contiene una stringa che rappresenta il nome del foglio ... ma la stai usando come stringa letterale , quindi VBA sta cercando di dereferenziare un oggetto di lamiera che è letteralmente chiamato "szTodayDate" ... e dal momento che non riesce a trovarlo, boom, errore di run-time 9.

Rimuovi le doppie virgolette:

Sheets(szTodayDate).Select

Ora stai per dereferenziare un oggetto foglio chiamato dopo il valore di il szTodayDate variabile stringa, che è probabilmente quello che intendevi.


Prossimi passi...

Trascina la logica di creazione dei fogli in una propria procedura separata; scrivendo piccole procedure specializzate che fai una cosa e fallo bene , renderà la tua vita molto più facile in linea.

Puoi sfruttare i valori di ritorno delle funzioni: Worksheets.Add restituisce un riferimento all'oggetto del foglio di lavoro che è stato creato: catturando tale riferimento in una variabile oggetto locale, ne rimuovi la necessità Select e poi a lavorare fuori ActiveSheet.

Puoi anche fornire un destinazione parametro a Range.Copy, rendendo l'intero select-copia-select-incolla operazione un one-liner.

Public Function CreateReportSheet(ByVal reportDate As Date) As Worksheet

    Dim reportSheet As Worksheet
    Set reportSheet = AddNamedWorksheet(ThisWorkbook, Format$(reportDate, "dd.mm.yy"))

    'only needed if the sheet doesn't exist at compile-time.
    'if it *does* exist at compile-time, just set the sheet's (Name) property to "inputSheet".
    'that identifier will then be globally available anywhere in the project.
    'Dim inputSheet As Worksheet
    'Set inputSheet = ThisWorkbook.Worksheets("DataInput")

    inputSheet.Range("A:A").Copy reportSheet.Range("A:A")
    Set CreateReportSheet = reportSheet

End Function

Public Function AddNamedWorksheet(ByVal wb As Workbook, ByVal sheetName As String) As Worksheet
    Dim sheet As Worksheet
    Set sheet = wb.Worksheets.Add
    On Error Resume Next ' naming the sheet will throw if name already exists
        sheet.Name = sheetName
    On Error GoTo 0 ' restore error handling
    Set AddNamedWorksheet = sheet
End Function

Vedo che hai un End Sub nella prima fase, ma non riesco a vedere alcun riferimento "Sub" per questo in modo che non venga eseguito? Anche come ho deciso di creare quel foglio se non esiste ad 1 orologio e ignoro prima 1. So che è facile per te ma per un principiante è come trovare qualcosa nell'oceano. Vedo ciò che hai scritto qui e Cerco di capire. Quella volta = o & gt; è impostato dalla variabile booleana per vedere se lo stato IF è vero o falso? Quella affermazione non riesco a capire nemmeno se tu l'abbia descritta. 'Dim inputSheet As Worksheet' Imposta inputSheet = ThisWorkbook.Worksheets ("DataInput")
SarXes

@SarXes typo, che avrebbe dovuto essere End Function - risolto. Ho saltato deliberatamente la parte temporale .. IMO una macro dovrebbe fare solo quello che gli dici di fare; se ne hai bisogno per essere eseguito in un momento specifico, dovresti implementarlo da qualche altra parte e invocare la procedura da lì. In questo modo puoi sempre testare tutto e rieseguirlo a piacere con vari parametri, indipendentemente dall'ora del giorno.
Mathieu Guindon

Implementa la macro nel codice che cosa hai scritto? Sì, so che vedi già quando scrivi il commento ma lo guardo come vuoi? La macro dovrebbe essere con una funzione secondaria forse ..
SarXes

Cerca qualcosa come "vba invocando una procedura in un momento specifico", otterrai un sacco di risultati Stack Overflow ; in pratica vorrai gestire il Workbook_Open evento (in ThisWorkbook ) e impostazione Application.OnTime per invocare la procedura all'ora specificata. Tuttavia, non mi piace questo approccio, perché fa sembrare che Excel sia una sorta di task scheduler e richiede che sia aperto in quel momento specifico, quindi Windows Update riavviando il computer lo interromperà. Ma sì, è fattibile e non implica alcun tipo speciale di logica condizionale.
Mathieu Guindon

Per semplificare, non voglio eseguirlo tutto il tempo solo per controllare l'ora corrente con l'ora impostata dopo l'apertura della cartella di lavoro e quindi creare automaticamente il foglio di report. Eliminerebbe il problema se dimenticassi o semplicemente escludessi per qualsiasi motivo. Newob noob chiede come assegnare un pulsante per fare quel foglio creando un pulsante. Voglio dire come il comando dovrebbe assomigliare ad assegnare una macro per esso, come ora se voglio eseguirlo non riesco a vedere tra le macro già rimesse.
SarXes
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.