引用一个尚不存在但将从单元格中的变量创建的工作表名称。 Excel VBA

时间:2016-09-23 09:43:43

标签: excel vba

我有一些代码可以自动格式化和复制模板,并创建副本以与相应的样本一起使用,例如单元格H5 = Batch1,它创建一个工作表Batch1 .. Cell I5 =“Magenta”,它创建一个名为“Magenta”的工作表。

我现在想编写一个宏,它将一系列单元格中的数据复制到这些创建的工作表中。但是尚未创建工作表。

有没有办法使用单元格引用指向数据存储位置?

e.g。工作表将命名为单元格H5中的任何内容。因此,使用单元格引用指向工作表而不是使用绝对工作表名称?

感谢您的帮助!

Sub CopyInfoSheetandInsert()

Dim rcell As Range
Dim Background As Worksheet
Set Background = Sheets("Formulation")

Application.ScreenUpdating = False

Sheets("Template").Visible = True

For Each rcell In Range("D7:W7")

If rcell.Value <> "" And SheetExists(rcell.Value) = False Then

      Sheets("Template").Copy Before:=Sheets("COSHH")
      Sheets(Sheets("COSHH").Index - 1).Name = rcell.Value

End If

Next rcell

Sheets("Template").Visible = False

Application.ScreenUpdating = True


End Sub

Function SheetExists(SheetName) As Boolean
Dim sht As Worksheet

'Assume Failure
SheetExists = False

For Each sht In ActiveWorkbook.Sheets
    If sht.Name = SheetName Then
        'Success
        SheetExists = True
        Exit Function
    End If
Next sht

End Function

3 个答案:

答案 0 :(得分:1)

  Dim newSheetName As String
  newSheetName = ActiveSheet.Range("H5").Value
  Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = newSheetName
  Worksheets(newSheetName).Range("H6").Value = "Text for new sheet"

上面的代码从变量newSheetName中的H5中选择sheetname。稍后在创建工作表时,它会将文本放在单元格H6的新工作表中

答案 1 :(得分:1)

当您调用Sheet.Copy方法时(假设您传递Before AfterActiveSheet参数,则活动工作表将成为新复制的工作表。因此,您只需使用Name对象即可访问If rcell.Value <> "" And SheetExists(rcell.Value) = False Then Sheets("Template").Copy Before:=Sheets("COSHH") ActiveSheet.Name = rcell.Value End If 属性。

请参阅下面的调整后代码:

Dim sheetName as String

sheetName = Worksheets("Data Entry").Range("D7").Value

...

Worksheets(sheetName)... 'this is the reference to your sheet.

<强>更新

我不确定我是否完全理解您的要求,但这可能有所帮助:

如果工作表名称只出现一次,那么当触发更新时,您的代码可能是:

Worksheet_Change

如果每次用户更改D7的值时名称都会更改,则需要在数据输入工作表的Option Explicit Private mCurSheet As Worksheet Public Sub FirstCreationOfSheet() Set mCurSheet = Worksheets("whatever the name is") End Sub 中添加例程。因此,您首先在模块级别引用工作表,如下所示:

Sub

然后在模块中添加Public Sub ChangeSheetName(newName As String) mCurSheet.Name = newName End Sub 更改名称:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim cell As Range

    For Each cell In Target.Cells
        If Not Intersect(Me.Range("D7"), cell) Is Nothing Then
            'Call the name change routine
            ChangeSheetName CStr(Me.Range("D7").Value)
        End If
    Next
End Sub

然后在您的“数据输入”代码中,您将使用Change事件:

<input type="checkbox" id="jqg_list2_jqg30" class="cbox" name="jqg_list2_jqg30" aria-checked="false">

答案 2 :(得分:1)

非常确定Jordan对于你所追求的内容有正确的答案,适用于您要编写的工作表位于工作表的单元格D7中的情况&#34;数据输入&#34;:

Dim nuWS as Worksheet
Set nuWS = Thisworkbook.Sheets(Thisworkbook.Sheets("Data Entry").Ra‌​nge("D7").Value)

然后您可以从xyz工作表复制并粘贴到nuWS:

Thisworkbook.Sheets("Data Entry").[D34:D38].copy
nuWS.[A1].Paste

或者就像

nuWS.[A1:A4].value = Thisworkbook.Sheet("Data Entry").[D34:D38].value