我怎样才能创build/复制工作表,同时基于特定的列中的单元格的值,但可变的行?

从本质上讲,我创build了一个跟踪表,它将有一个单元格,点击后,将在同一个工作簿中创build一个新的Excel表。 为了testing的目的,我现在只是让它创build一个新的工作表,但最终我会有一个工作表,它会复制。 我需要帮助的是,我如何让VB拉取一个单元格的值作为新/复制表的名称? 这是一个场景:

每一行将有一个客户端列(这是列C),我想用于将被创build的工作簿的名称。 我试图有一个单元格(比如在该行中的列R),单击时创build一个新的工作表,并在该行中的列C的值作为工作表的名称。

所以说,第5行在C5中有“testing客户端”。 单击R5时,我希望它创build一个名为“Test Client”的工作表。 我已经看到了使用循环遍历列的解决scheme,并为每个列创build一个工作表,但这并不适用于我的场景,因为我需要它们随时创build,而不是每行。

我知道如何在VB中创build工作表,但我的问题是获取名称。 有没有办法让vba从C列中取得激活的行? 所以如果第5行被激活,它将拉动C5,如果是第10行,则拉动C10等等。

任何build议将不胜感激,我目前正在使用它来创build工作表:

Sub CreateSheet() Dim ws As Worksheet Set ws = ThisWorkbook.Sheets.Add(After:= _ ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)) End Sub 

这要调用:

 Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Row > 5 And Target.Column = 18 And Target.Count = 1 Then Call CreateSheet End Sub 

下面的代码读取相关行的列C中的值,然后将其作为String传递给您的函数:

 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Row > 5 And Target.Column = 18 And Target.Count = 1 Then Dim ShtName As String ShtName = Cells(Target.Row, "C").Value Call CreateSheet(ShtName) End If End Sub 

这是你的函数,我添加了一个代表工作表名称的String

 Public Sub CreateSheet(ws_Name As String) Dim ws As Worksheet Set ws = ThisWorkbook.Sheets.Add(After:= _ ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)) ws.Name = ws_Name End Sub 

更新:Shai Rado指出我错过了一个error handling程序。

您应该testing以确定工作表是否首先存在。 这种模式可以使代码更容易debugging和添加function。

工作表模块

 Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim ws As Worksheet Dim WorksheetName As String If Target.Row > 5 And Target.Column = 18 And Target.Count = 1 Then WorksheetName = Cells(Target.Row, "C").Value Set ws = getWorkSheet(WorksheetName) If Not ws Is Nothing Then Set ws = getNewWorkSheet(WorksheetName) End If End Sub 

标准模块

 Function getWorkSheet(WorksheetName As String, Optional WorkbookName As String) As Worksheet If Len(WorkbookName) = 0 Then WorkbookName = ThisWorkbook.Name With Workbooks(WorkbookName) On Error Resume Next Set getWorkSheet = .Worksheets(WorksheetName) On Error GoTo 0 End With End Function Function getNewWorkSheet(WorksheetName As String, Optional WorkbookName As String) As Worksheet Dim ws As Worksheet If Len(WorkbookName) = 0 Then WorkbookName = ThisWorkbook.Name With Workbooks(WorkbookName) Set ws = .Worksheets.Add(After:=.Worksheets(.Worksheets.Count)) On Error Resume Next ws.Name = WorksheetName If Err.Number = 0 Then Set getNewWorkSheet = ws Else ws.Delete End If On Error GoTo 0 End With End Function