Попытка удалить лист и создать новые - PullRequest
0 голосов
/ 16 февраля 2019

Я пытаюсь запустить программу, чтобы она удалила уже существующий лист, создала новый, чтобы я могла заполнить его результатами.Я хочу иметь возможность делать это каждый раз, когда я запускаю программу, чтобы получить новый лист без предыдущих результатов.

Dim CustomerID As Integer
Dim SameID As Integer
Dim TotalSpent As Currency
Dim HighSpenders As Integer
Dim CustomerOrder As Integer
Dim DataCell As Range
Dim ReportCell As Range
Dim UserAmount As Variant
Dim UserAmount1 As Integer
Dim wsData As Worksheet
Dim wsReport As Worksheet

Set wsData = ActiveWorkbook.Sheets("Data")

Application.DisplayAlerts = False
On Error Resume Next
ActiveWorkbook.Sheets("Report").Delete
On Error GoTo -1
Application.DisplayAlerts = True

Do

    UserAmount = InputBox("Enter an amount")

    If Not IsNumeric(UserAmount) Then

    MsgBox "Enter a numeric value"

    Else
        UserAmount1 = CInt(UserAmount)
    End If
Loop While Not IsNumeric(UserAmount)

Set wsReport = ActiveWorkbook.Sheets.Add(After:=Sheets(Sheets.Count)).Name = "Report"

Set DataCell = wsData.Range("A3")
Set ReportCell = wsReport.Range("A3")

Проблема сейчас заключается в том, что он не создает новый рабочий лист под названием Отчет с результатами.

Ответы [ 2 ]

0 голосов
/ 16 февраля 2019

Удалить лист ft. При ошибке Перейти к 0

  • Если этот код находится в ActiveWorkbook, вместо него следует использовать ThisWorkbook или ссылаться на него по имени, например Workbooks(CreateReport.xlsm).
  • Используйте оператор With для объектов, чтобы сделать код более читабельным и избежать ненужных ошибок ссылок:

    Часть параметра аргумента After After:=Sheets(Sheets.Count) 'равна,Я бы сказал, неверно и должно было быть:

    After:=ActiveWorkbook.Sheets(ActiveWorkbook.Sheets.Count).

    Почему тогда все еще работает правильно?Это потому, что при пропуске ActiveWorkbook, на самом деле используется ActiveWorkbook («понятно», «по умолчанию»).Вы могли бы опустить все использованные вами ссылки ActiveWorkbook, и все Sheets все равно (правильно) ссылались бы на листы ActiveWorkbook.

    Почему неправильно?Вы решили изменить все ActiveWorkbook экземпляров на Workbooks("CreateReport.xlsm").Вероятно, вы не добавите ссылку в аргумент After, который может дать вам нежелательные результаты, поскольку он ссылается на ActiveWorkbook, который может быть другой книгой (не CreateReport.xlsm).

    Последняя частьприведет нас к еще одному преимуществу использования оператора With, а именно, если вы хотите изменить ссылку на рабочую книгу, вам придется изменить ее только в операторе With ( один раз ), например:

    With Workbooks("CreateReport.xlsm")

  • VBA делает не поддерживает On Error Goto -1, VisualBasic делает.Если бы вы использовали

    On Error Goto 0,

    , код вывел бы Run-time error '424': Object required и выделил бы строку Set wsReport = ..., и вы бы сразу зналичто это была строка, которую нужно было изменить.

  • Вы можете использовать ту же переменную UserAmount (как Variant) вместо UserAmount1.Для предотвращения Run-time error '6': Overflow при вводе значения, которое превышает предел Integer, например 32768, следует использовать Long вместо Integer:

    UserAmount = CLng(UserAmount)

    'или:

    Dim UserAmount1 as Long

    ...

    UserAmount1 = Clng(UserAmount)

    , если вы будете придерживаться переменной UserAmount1.

  • Вы не можете добавить новый лист и переименовать его за один раз (в той же строке).Вы должны использовать две строки:

    With ActiveWorkbook
        Set wsReport = .Sheets.Add(After:=.Sheets(.Sheets.Count))
    End With
    wsReport.Name = "Report"
    
  • Рекомендуется создавать заголовки или кратко описывать различные разделы кода.Я, вероятно, добавил слишком много.

Код

Sub AddSheet()

    Dim CustomerID As Integer
    Dim SameID As Integer
    Dim TotalSpent As Currency
    Dim HighSpenders As Integer
    Dim CustomerOrder As Integer
    Dim DataCell As Range
    Dim ReportCell As Range
    Dim UserAmount As Variant
    'Dim UserAmount1 As Long
    Dim wsData As Worksheet
    Dim wsReport As Worksheet

    ' If this code is in the ActiveWorkbook, use ThisWorkbook instead.
    With ThisWorkbook

        ' Create a reference to Data Sheet.
        Set wsData = .Sheets("Data")

        ' Delete (old) Report Sheet.
        On Error Resume Next
            Application.DisplayAlerts = False
                .Sheets("Report").Delete
            Application.DisplayAlerts = True
        On Error GoTo 0 ' VBA doesn't support On Error Goto -1

        ' Input UserAmount.
        Do
            UserAmount = InputBox("Enter an amount")
            If Not IsNumeric(UserAmount) Then
                MsgBox "Enter a numeric value"
              Else
                ' You can use the same variable.
                ' To prevent "Run-time error '6': Overflow" when entering a
                ' value that exceeds the integer limit e.g. 32768, you have
                ' to use Long.
                UserAmount = CLng(UserAmount)
                'UserAmount1 = CLng(UserAmount)
            End If
        Loop While Not IsNumeric(UserAmount)

        ' Create a reference to a newly added sheet.
        Set wsReport = .Sheets.Add(After:=.Sheets(.Sheets.Count))

    End With

    ' Rename the newly added sheet.
    wsReport.Name = "Report"

    ' Create references to cells "A3" of both worksheets.
    Set DataCell = wsData.Range("A3")
    Set ReportCell = wsReport.Range("A3")

End Sub
0 голосов
/ 16 февраля 2019

Вы не декларируете или не настраиваете wsData или wsReport.Это как минимум установит wsReport на вновь созданную рабочую таблицу.

Dim CustomerID As Integer, SameCustomerID As Integer
Dim TotalSpent As Currency
Dim HighSpenders As Integer, CustomerOrder As Integer,  UserAmount1 As Integer
Dim DataCell As Range, ReportCell As Range
Dim UserAmount As Variant
dim wsData as worksheet, wsReport as worksheet

application.displayalerts = false    'do NOT ask for confirmation
on error resume next                 'if Reports doesn't exist, keep going
ActiveWorkbook.Sheets("Report").Delete
on error goto -1                     'reset the error handler
application.displayalerts = true     'turn alerts back on

Do    
    UserAmount = InputBox("Enter an amount")

    If Not IsNumeric(UserAmount) Then    
        MsgBox "Enter a numeric value"    
    Else
        UserAmount1 = CInt(UserAmount)
    End If
Loop While Not IsNumeric(UserAmount)

set wsReport = ActiveWorkbook.workSheets.Add(After:=Sheets(Sheets.Count))
with wsReport
    .Name = "Report"
end with

Set ReportCell = wsReport.Range("A3")
'wsData is still not set to any worksheet
Set DataCell = wsData.Range("A3")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...