Pregunta Hoja nueva automática de Excel con copia de columna y fecha de hoy


Quiero escribir una rutina de VBA que sería "diaria"

  • crea una nueva hoja
  • darle a esa nueva hoja un nombre del formulario DD.MM.YY (con ceros a la izquierda), basado en la fecha de hoy (por ejemplo, 25.07.18)
  • copiar los valores de las columnas A y B de mi DataInput hoja en la nueva hoja.

¿Qué quiero decir con "diariamente"? Solo si la hora actual es = o> una hora específica del día, entonces cree la hoja, de lo contrario simplemente ignore.

No creo que sea difícil de manejar. Traté de combinar algunas fórmulas para juntarlas pero me dan un error todo el tiempo.

Estaba pensando en algo

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

0


origen


Entonces, ¿en qué línea está el error? ¿Cuál es el mensaje de error? - DavidPostill♦
@DavidPostill ignorando el error de compilación de la etiqueta de línea comentada, que sería el error de tiempo de ejecución 9 al intentar eliminar la referencia Sheets("szTodayDate")que no existe OP necesita eliminar las comillas dobles que están convirtiendo su variable en una cadena literal. - Mathieu Guindon
Como soy novato en vba, y para mí es un hobby aprender "codificación" que no puedo ver a través de estos significados de cadena / variable. Sabía que algo estaba mal aquí pero no lo vi. - SarXes


Respuestas:


El error está aquí:

Sheets("szTodayDate").Select

szTodayDate no es el nombre de la hoja; es una variable local que contiene una cadena que representa el nombre de la hoja ... pero la está usando como una cadena literal, por lo que VBA intenta desreferenciar un objeto de hoja literalmente llamado "szTodayDate" ... y como no puede encontrarlo, boom, run-time error 9.

Eliminar las comillas dobles:

Sheets(szTodayDate).Select

Ahora va a desreferenciar un objeto de hoja con el nombre El valor de el szTodayDate variable de cadena, que es probablemente lo que pretendía.


Próximos pasos...

Tire de la lógica de creación de hojas en su propio procedimiento separado; escribiendo pequeños procedimientos especializados que Haz una cosa y hazla bien, hará que tu vida sea mucho más fácil en la línea.

Puede aprovechar los valores de retorno de las funciones: Worksheets.Add devuelve una referencia al objeto de la hoja de trabajo que se creó: al capturar esa referencia en una variable de objeto local, se elimina la necesidad de Select y luego para trabajar ActiveSheet.

También puede proporcionar un destino parámetro a Range.Copy, haciendo que todo seleccionar-copiar-seleccionar-pegar operación de una sola línea.

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

0



Veo que tienes un End Sub en la primera fase, pero no puedo ver ninguna referencia "Sub" para que no se ejecute. . También cómo configuré para crear esa hoja si no existe a 1 reloj e ignoro antes 1. Sé que es fácil para usted, pero para un novato es como encontrar algo en el océano. Veo lo que escribió aquí y Intento entender. Ese tiempo = o> lo establece la variable booleana para ver si el estado IF es verdadero o falso. Esa declaración que no puedo entender, incluso si usted lo describió. 'Dim inputSheet As Worksheet' Establecer inputSheet = ThisWorkbook.Worksheets ("DataInput") - SarXes
@SarXes error tipográfico, que debería haber sido End Function - arreglado. Supliqué deliberadamente la parte del tiempo. Una IMO macro debería hacer exactamente lo que le dices que haga; si necesita que se ejecute en un momento específico, debe implementarlo en otro lugar e invocar ese procedimiento desde allí. De esta forma, siempre puede probar todo y volver a ejecutarlo a voluntad con varios parámetros, independientemente de la hora del día. - Mathieu Guindon
Implementa la macro en el código ¿qué escribiste? Sí, sé que ya lo ves cuando escribes el comentario, pero solo lo veo como wth? La macro debería estar con una función secundaria tal vez ... - SarXes
Busque algo como "vba invocando un procedimiento en un momento específico", obtendrá muchos resultados en Desbordamiento de pila; Básicamente, querrás manejar el Workbook_Open evento (en ThisWorkbook) y configuración Application.OnTime invocar el procedimiento en el tiempo especificado. Sin embargo, me desagrada este enfoque, porque hace que Excel pretenda ser una especie de programador de tareas y requiere que esté abierto en ese momento específico, por lo que la actualización de Windows de la noche que reinicie su máquina lo romperá. Pero sí, es factible y no implica ningún tipo especial de lógica condicional. - Mathieu Guindon
Para hacerlo simple, no quiero ejecutarlo todo el tiempo solo para verificar la hora actual con el tiempo establecido después de que se abrió el libro de trabajo y luego crear esa hoja de informe automáticamente. Eliminaría el problema si lo olvidara o simplemente lo eludiría por cualquier razón. Novato novato preguntando cómo asignar un botón para que haga esa hoja creando un botón. Me refiero a cómo se vería el comando para asignarle una macro, ya que ahora si quiero ejecutarlo no puedo ver entre las macros ya procesadas. - SarXes