【问题标题】:Copy a Worksheet if the Cell Value equals a certain string using row and column indexes如果单元格值等于使用行和列索引的某个字符串,则复制工作表
【发布时间】:2022-10-05 22:02:07
【问题描述】:

这样做的目的是找到具有标题“类型测试”的列并遍历该列,在本例中为 B 以查找所有唯一值单元格。如果 B 列中的字符串是唯一的并且不能替换,我需要它来制作名称与 A 列中的试验名称匹配的工作表的副本。因此对于行索引为 3 且列索引为 2 的测试 1 , 将在当前工作簿中创建一个名为 \"DEF\" 的工作表副本,并将副本重命名为 \"Test 1\"

例如这里是我的数据

  1.  A            B
    
  2.  Trial     Type_Test 
    
  3.  DEF        Test 1
    
  4.  ABC        Test 3
    
  5.  ABC        Test 10
    
  6.  DEF        Test 14 
    
  7.  ABC        Test 10 
    

    但是,如果 A 列的 B 列值重复,我不想复制工作表 ABC,所以由于第 3 行和第 5 行相同,我只想复制 ABC 工作表两次,一次用于第 2 行,一次对于第 3 行。第 5 行可以忽略,因为它与第 3 行相同。

    我已经编写了一个代码,它完成了关于制作工作表和重命名它的第一部分,我只是无法获得另一个工作表部分的副本。

    Public Sub Main()
    
    Dim srtsht As Variant, sysnum As Variant, arr As Variant, partnum As Variant
    Dim wsh As Worksheet
    
        srtsht = Sheets(\"Sheet1\").Range(\"E2:E15\")
    
        With CreateObject(\"scripting.dictionary\") \' store data in array where each item is associated with a unique key
            For Each sysnum In srtsht
                arr = .Item(sysnum)
            Next sysnum
        For Each value In .Keys
            On Error Resume Next
            If value <> \"\" Then
                Set wsh = Nothing \' clear the variable wsh
                Set wsh = Worksheets(CStr(value)) \' try to set wsh to the sheet with Value as name
                On Error GoTo 0
                If wsh Is Nothing Then 
    
                Call position 
             
                If Worksheets(\"Sheet1\").Cells(A_row,A_col).Value = \"ABC\" Then 
                Worksheets(\"ABC\").Copy After:=ActiveSheet 
                wsh = Worksheets(\"Sheet1\").Cells(A_row,A_col).Values 
                Worksheets(\"ABC (2)\").name = wsh 
                wsh.name = CStr(Value)
                End If 
                Else 
                   MsgBox \"Sheet\" & Values & \"already exists.\", vbInformation 
                End If 
              End If  
           Next Value 
         End With 
    End Sub 
    
    Sub position () 
    Dim syswaivernum As Range, partnumber As Range
    
    For Each syswaivernum In Worksheets(\"Sheet1\").Range(\"A1:Z20\")
            If syswaivernum.value = \"Number(s)\" Then
            sysnumcol = syswaivernum.Column
            sysnumrow = syswaivernum.Row
            End If
        Next syswaivernum
    For Each partnumber In Worksheets(\"Sheet1\").Range(\"A1:Z20\")
            If partnumber.value = \"Part\" Then
            A_col = partnumber.Column
            A_row = partnumber.Row
        End If
    Next partnumber
    
    End Sub
    
    
                
    
  • 我不确定您的问题与您的标题有何关系。可以将Cell 与行和列索引一起使用。你的问题到底是什么?
  • @Sorceri 我已经添加了到目前为止我编写的代码。我可以制作名为 Test 1 Test 2 等的新工作表,但我无法制作 ABC 等工作表的副本
  • @BigBen 我试过做 If Worksheets(\"Sheet1\").Cells(A_row,A_column).Value = \"ABC\" Then Worksheets(\"ABC\").Copy After:= ActiveSheet,但它没有工作
  • 你是如何给A_rowA_column 赋值的?请创建一个minimal reproducible example
  • 您创建了一个字典,然后立即调用arr = .Item(sysnum) - 您的字典没有内容吗?你不打算在里面放任何内容吗?

标签: excel vba


【解决方案1】:

试试这个 - 见 cmets inline:

Public Sub Main()

    Dim wb As Workbook, tst As String, wsName As String
    Dim c As Range, ws As Worksheet, dict As Object
    
    Set wb = ThisWorkbook
    Set ws = wb.Worksheets("Sheet1")
    
    Set dict = CreateObject("scripting.dictionary")
    For Each c In ws.Range("E2:E15").Cells
        tst = c.Value
        If Not dict.exists(tst) Then 'first time seeing this value?
            dict.Add tst, True '###
            If Not SheetExists(tst) Then
                wsName = c.EntireRow.Columns("A").Value    'sheet to be copied
                If SheetExists(wsName) Then 'if there's a sheet for wsName
                    wb.Worksheets(wsName).Copy After:=ws       'copy the sheet
                    wb.Worksheets(ws.Index + 1).Name = tst  '### rename the copy
                End If
            Else
                MsgBox "Sheet '" & wsName & "' already exists"
            End If
        End If
    Next c
End Sub

'Does a sheet named `SheetName` exist?
'  Defaults to checking `ThisWorkbook` if `wb` is not specified
Function SheetExists(SheetName As String, _
                     Optional wb As Excel.Workbook) As Boolean
    If wb Is Nothing Then Set wb = ThisWorkbook
    On Error Resume Next
    SheetExists = Not wb.Sheets(SheetName) Is Nothing
End Function

【讨论】:

  • 我尝试了您提供的代码,但是我收到一条错误消息,指出对象变量或块变量未在“If Not dict.exists(tst) Then”行设置当我单步执行代码时,它将我的值保存在 tst 但随后无法识别 wsName
  • 测试并添加了一些修复(用###标记)
  • 不幸的是,这也不起作用;我仍然在与以前相同的行中遇到相同的错误。当您说 wsName = c.EntireRow.Columns("A").Value 时,“A”指的是什么?上面所说的范围是“E2:E15”,这会对代码不运行有什么影响吗?
  • 您将需要调整这些范围以适合您的数据。在您发布的数据样本中,Col E 是“Type_Test”,而 ColA 是“Trial”
  • 是的,我的错。当我在帖子中添加示例数据时,我感到很困惑。即使在我调整了范围以适合我的数据之后,它也不能解决对象变量或块错误。每个变量都已定义,所有 if 语句都有其结束 if 语句
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多