Выбор листа по имени, у меня есть имя в виде строки - PullRequest
0 голосов
/ 02 января 2019


Довольно новый для кода VBA, нужна помощь ...
У меня есть код VBA, который копирует лист шаблона и переименовывает его, у меня есть новое имя, сохраненное в виде общедоступной строки:
«My_Tamplate» - это лист, который я копирую с
«PublicStringName» - это открытая строковая переменная, которую я использую для переименования в
Я также использую «PublicStringName» в других местах в форме, для этого мне и понадобилась строка.

    Sheets("My_Tamplate").Copy After:=Worksheets(Sheets.Count)
    ActiveSheet.name = PublicStringName

Затем, когда мне нужно записать данные, собранные с помощью формы, я хочу записать их на вновь созданный лист.
затем я открываю новую форму, собираю данные от пользователя к нескольким переменным.
Теперь я хочу записать данные во вновь созданный лист (теперь он называется «PublicStringName») Если я объявлю WS рабочим листом, он не примет «PublicStringName», поскольку это строка (я думаю). Я не знаю, каким будет номер листа, поэтому я не могу назвать его, например, (sheet1).

Спасибо заранее Эйтан

Обновление - 06 ЯНВ 19

Я не знаю, как загрузить мой пример Excel, поэтому:
Excel имеет 2 листа: Data (лист2) и Project_Template (Лист1)
В листе 2 C3 у меня есть = MAX (B: B)
У меня есть 1 форма (UserForm1), это многостраничный объект
на странице 1 у меня есть текстовое поле txtProjectName и кнопка cmdCreateProject
на странице 2 у меня есть 5 текстовых полей с именами от txtData1 до txtData5 и кнопка обновления btnUpdate
Я попробовал бы решение PeterT (здесь в коде)
прикрепив проблемный код здесь:

Public ProjectName

Private Sub btnUpdate_Click()
Dim WS As Worksheet
Dim Addme As Range
Set WS = ThisWorksheet.Sheets(ProjectName)
Set Addme = WS.Cells(Rows.Count, 3).End(xlUp)
With WS
Addme.Offset(0, 1).Value = Me.txtData1
Addme.Offset(0, 2).Value = Me.txtData2
Addme.Offset(0, 3).Value = Me.txtData3
Addme.Offset(0, 4).Value = Me.txtData4
Addme.Offset(0, 5).Value = Me.txtData5
End With
MsgBox "Contact for Project:" & " " & ProjectName & ", " & "was successfully 
added"
End Sub

Private Sub cmdCreateProject_Click()
Dim path As String
Dim mydir As String
Dim DataSh As Worksheet
Set DataSh = Sheet2
ProjectName = ""

'error handler
On Error GoTo errHandler:

ProjectName = Me.txtProjectName.Value
If Me.txtProjectName.Value = "" Then
MsgBox "Please enter a Project Name", vbOKOnly, "Project Name Error"
Exit Sub
End If
mydir = ThisWorkbook.path & "\" & ProjectName

If Dir(mydir, vbDirectory) = "" Then
MkDir mydir
'Copy tamplate sheet to for new Project
Sheets("Project_Template").Copy After:=Worksheets(Sheets.Count)
ActiveSheet.Name = ProjectName
Else
MsgBox "Directory already exsists"
Me.txtProjectName.Value = ""
Me.txtProjectName.SetFocus
ProjectName = ""
Exit Sub
End If
Set Addme = DataSh.Cells(Rows.Count, 3).End(xlUp).Offset(1, 0)
DataSh.Activate
DataSh.Select
With DataSh

'add the unique reference ID then all other values
Addme.Offset(0, -1) = DataSh.Range("C3").Value + 1
Addme.Value = Me.txtProjectName
End With
Me.MultiPage1.Pages(1).Enabled = True
Me.MultiPage1.Pages(1).Visible = True
Me.MultiPage1.Pages(0).Enabled = Fals
Me.MultiPage1.Pages(0).Visible = Fals
Exit Sub
errHandler:
'if error occurs then show me exactly where the error occurs
MsgBox "Error " & Err.Number & _
" (" & Err.Description & ")in procedure PcmdClear_Click of Form ProjectDB"
End Sub

Теперь, когда я пытаюсь обновить только что созданный Рабочий лист (названный в честь проекта), я получаю сообщение об ошибке: Ошибка времени выполнения '424':
Требуется объект
на линии:

Set WS = ThisWorksheet.Sheets(ProjectName)

Я думаю, что в ответе ученика Гэри отсутствует шаг, на котором после создания нового листа я начинаю собирать данные

Надеюсь, что я прояснил это

1 Ответ

0 голосов
/ 02 января 2019

Вот один из способов использования имени:

Sub FreshSheet()
    Dim PublicStringNAme As String
    PublicStringNAme = "Ellan"

    Sheets("My_Tamplate").Copy After:=Worksheets(Sheets.Count)
    ActiveSheet.Name = PublicStringNAme
    '
    '
    '
    '
    Sheets(PublicStringNAme).Range("A1") = 1
End Sub

Если вы хотите сделать переменную «более глобальной», тогда:

Public PublicStringName As String

Sub FreshSheet()
    PublicStringName = "Ellan"

    Sheets("My_Tamplate").Copy After:=Worksheets(Sheets.Count)
    ActiveSheet.Name = PublicStringName
    '
    '
    '
    '
    Sheets(PublicStringName).Range("A1") = 1
End Sub

См .:

Объем

...