【问题标题】:Reference a sheet name that doesn't yet exist but will be created from a variable in a cell. Excel VBA引用尚不存在但将从单元格中的变量创建的工作表名称。 Excel VBA
【发布时间】:2016-09-23 19:11:30
【问题描述】:

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

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

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

例如工作表将被命名为单元格 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

【问题讨论】:

  • 这应该很简单,但您能否将代码的复制部分添加到问题中,以便我们查看您当前如何引用工作表。
  • Thisworkbook.Sheets(Thisworkbook.Sheets("Worksheet_Name").Range("H5").Value)?
  • 所以我创建的电子表格工作正常,代码在上面。但是例如..我在 D34:D38 中有一系列数据,我想将其复制到用 D7 编写的工作表名称中。

标签: excel vba


【解决方案1】:

当您调用Sheet.Copy 方法时(假设您传递了AfterBefore 参数,正如您所做的那样),活动工作表将成为新复制的工作表。因此,您可以简单地使用ActiveSheet 对象来访问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.

如果每次用户更改 D7 的值时名称都会更改,那么您需要在数据输入工作表的 Worksheet_Change 中添加一个例程。因此,您首先要在模块级别引用工作表,如下所示:

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

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

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

【讨论】:

  • 对不起,我真的很难解释这个!这样代码就会被执行并且过程已经完成。
  • 对不起,我真的很难解释这个!第 1 步,上面的代码将被执行并且该过程已经完成并创建了我需要的工作表......例如(“Sheet1”)然后一个人将使用工作表“数据输入”来输入一些数据......然后将是从步骤 1 复制到“Sheet1”中。我需要先为“数据输入”表中输入的数据的去向编写代码。工作表名称将在单元格 D7 中指定。
  • 我知道如何让代码写入工作表,但它是从单元格值引用工作表。
【解决方案2】:
  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 处将文本放置到新工作表

【讨论】:

  • 不完全符合我的要求,但我设法从您的代码中解决了它。 Sub UpdateInitials() ' ' UpdateInitials Macro ' Dim newSheetName As String newSheetName = ActiveSheet.Range("D7").Value Worksheets(newSheetName).Range("f7").Value = Worksheets("Formulation").Range("F50 ").Value 结束子
【解决方案3】:

很确定 Jordan 对您所追求的目标有正确的答案,适用于您的场景,其中要写入的工作表位于工作表“数据输入”的单元格 D7 中:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多