首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VBA Excel基于单元格值自动生成用于递增单元格的新工作表

VBA Excel基于单元格值自动生成用于递增单元格的新工作表
EN

Stack Overflow用户
提问于 2021-03-17 15:17:55
回答 2查看 386关注 0票数 1

我想在Excel中根据单元格值自动填充新工作表的名称。但是,它将不是来自一个单元格的值,而是来自行中的单元格列表的值。第一个工作表的名称将从第一个单元格值中获取,第二个工作表的名称将从第二个单元格值中获取,等等。我定义了这些单元格的最大范围--行中的20个,但并不是所有的单元格都有这些值。我希望只从这些单元格中创建新的工作表,在这些单元格中提供值。

我使用了以下代码:

代码语言:javascript
复制
 Sub Namedsheetsadding()
 Dim wsr As Worksheet, wso As Worksheet
 Dim i As Long, xCount As Long
 Dim SheetName As String

 Set wsr = ThisWorkbook.Sheets("Vetro Area Map 1")


 SheetName = ThisWorkbook.Sheets("Frontsheet").Range("D122:D142")  'including empty cells either, but 
 not creating new sheets for them

 For i = 1 To ActiveWorkbook.Sheets.Count
 If InStr(1, Sheets(i).name, "Vetro") > 0 Then xCount = xCount + 1
 Next

 wsr.Copy After:=ActiveWorkbook.Sheets(wsr.Index - 1 + xCount)
 ActiveSheet.name = "Vetro Area Map " & SheetName & xCount + 1

 End Sub

根据这里的一些解决方案:

只适用于一个单元格

可能这就是为什么我会:

错误:类型错配

关于以下一行:

代码语言:javascript
复制
  SheetName = ThisWorkbook.Sheets("Frontsheet").Range("D122:D142")  'including empty cells either, but not creating new sheets for them

是否有机会根据单元格范围使用名称自动填充工作表?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-03-17 16:03:36

这应该做你想要的,它从范围得到一个数组,将它转换成一个一维数组,然后制作工作表。

代码语言:javascript
复制
 Sub Namedsheetsadding()
 Dim wsr As Worksheet, wso As Worksheet
 Dim i As Long, xCount As Long
 Dim SheetNames As Variant   'This needs to be variant
 Dim sheetname As Variant
 Dim newsheet As Worksheet
 Dim lr As Long
 
 Set wsr = ThisWorkbook.Sheets("Vetro Area Map 1")

 lr = ThisWorkbook.Sheets("Frontsheet").Cells(Rows.Count, 4).End(xlUp).Row 'Get last row
 SheetNames = ThisWorkbook.Sheets("Frontsheet").Range("D122:D" & lr)  'including empty cells either, but not creating new sheets for them
 SheetNames = Application.Transpose(Application.Index(SheetNames, , 1)) 'Converts the 2d array into a 1d array
 For i = 1 To ActiveWorkbook.Sheets.Count
    If InStr(1, Sheets(i).Name, "Vetro") > 0 Then xCount = xCount + 1
 Next

 For Each sheetname In SheetNames
    wsr.Copy After:=ActiveWorkbook.Sheets(wsr.Index - 1 + xCount)
    Set newsheet = Sheets(wsr.Index + xCount)
    newsheet.Name = "Vetro Area Map " & sheetname
    xCount = xCount + 1 'Preserve order of sheets from range
 Next
 End Sub
票数 3
EN

Stack Overflow用户

发布于 2021-03-17 15:54:18

在回答您的问题时,YES,您可以使工作表自动命名,但是您需要更好地处理规则。因为要将数组引用到单个字符串,所以会收到错误。我建议学习数组(保罗·凯利有一些这里的东西很棒),但是可能有其他方法来解决您的特定问题。

如果您比VBA更熟悉Excel,则应该尝试创建一个单元格公式规则,该规则填充一个单元格,该单元格应该是工作表的下一个名称。如果可以有一个始终具有正确名称的单元格,则始终可以让代码引用相同的值。

或者,您可能希望使用VBA偏移函数,这对于较新的程序员来说非常容易理解。

作为一个例子,见下文。

代码语言:javascript
复制
Sub makeNewWorksheets()
 Dim wsr As Worksheet, wso As Worksheet
 Dim i As Long, xCount As Long
 Dim SheetName As String

 Dim startTingCell As Range
    Set startTingCell = Range("D122")
    
 For i = 1 To ActiveWorkbook.Sheets.Count
   If InStr(1, Sheets(i).Name, "Vetro") > 0 Then xCount = xCount + 1
 Next

        'Changes the cell being referenced by xCount
            Set startTingCell = startTingCell.Offset(xCount, 0)
            
        'helps explain what is happening. Delete after you've grasped what's up.
        MsgBox "The cell that will be set to the name is " & startTingCell.Address & _
        "with a value of " & startTingCell.Value
        
        wsr.Copy After:=ActiveWorkbook.Sheets(wsr.Index - 1 + xCount)
        ActiveSheet.Name = "Vetro Area Map " & startTingCell.Value
        
End Sub
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66676014

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档