如何在 VBA 中根据 A 列重复名称将整个行复制到其各自的工作表?

2023-12-10

我当前的代码将尝试使用 VBA 将基于列 A 重复名称的整行复制到其各自的工作表,如下所示。但它只适用于第一个重复的名称,而不适用于其余的名称。当我检查我的代码时,我意识到我的目标(在目标=Lbound到Ubound部分的部分)始终为0,所以我想知道为什么在这种情况下它总是0?因为它应该在 0 到 3 之间?

Sub test()

Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets("Sheet1")
Dim cs As Worksheet
    Dim mycell As Range, RANG As Range, Mname As String, Rng As Range


Dim r As Range, dict As Object
    Set dict = CreateObject("Scripting.Dictionary")
    With Sheets(1)
        ' Build a range (RANG) between cell F2 and the last cell in column F
        Set RANG = Range(.Cells(2, "A"), .Cells(.Rows.count, "A").End(xlUp))
    End With


    ' For each cell (mycell) in this range (RANG)
    For Each mycell In RANG
        Mname = mycell.Value
        ' If the count of mycell in RANG is greater than 1, then set the value of the cell 1 across to the right of mycell (i.e. column G) as "Duplicate Found"
        If Application.WorksheetFunction.CountIf(RANG, mycell.Value) > 1 Then


        If dict.count > 0 And dict.Exists(Mname) Then
        dict(Mname) = mycell.Row()
        Else
        dict.Add Mname, mycell.Row()
        End If

        End If
    Next mycell

Dim x As Long, Target As Long, i As Long
Dim CopyMe As Range
'Dim Arr: Arr = Array(Key)
Dim f As Variant

For x = 1 To 4
    Set cs = ThisWorkbook.Sheets.Add(After:=Sheets(ThisWorkbook.Sheets.count))
    cs.Name = "Names" & x
Next x

    'Display result in debug window (Modify to your requirement)
    Startrow = 2


For Each Key In dict.Keys
Set Rng = ws.Range("A" & Startrow & ":A" & dict(Key))

'Create 3 Sheets, move them to the end, rename

lr = dict(Key)

v = dict.Keys 'put the keys into an array 

'Loop through each name in array
For Target = LBound(v) To UBound(v) - 1 '<-------why is Target always 0 here?


   'Loop through each row
    For i = Startrow To lr

        'Create Union of target rows
        If ws.Range("A" & i) = v(Target) Then
            If Not CopyMe Is Nothing Then
                Set CopyMe = Union(CopyMe, ws.Range("A" & i))
            Else
                Set CopyMe = ws.Range("A" & i)
            End If
        End If
    Next i


    Startrow = dict(Key) + 1

    'Copy the Union to Target Sheet
    If Not CopyMe Is Nothing And Target = 0 Then
        CopyMe.EntireRow.Copy Destination:=ThisWorkbook.Sheets("Names1").Range("A1")
        Set CopyMe = Nothing
    End If
        If Not CopyMe Is Nothing And Target = 1 Then
        CopyMe.EntireRow.Copy Destination:=ThisWorkbook.Sheets("Names2").Range("A1")
        Set CopyMe = Nothing
    End If
     If Not CopyMe Is Nothing And Target = 2 Then
        CopyMe.EntireRow.Copy Destination:=ThisWorkbook.Sheets("Names3").Range("A1")
        Set CopyMe = Nothing
    End If
      If Not CopyMe Is Nothing And Target = 3 Then
        CopyMe.EntireRow.Copy Destination:=ThisWorkbook.Sheets("Names4").Range("A1")
        Set CopyMe = Nothing
    End If
Next Target

    Next

End Sub

主要工作表

enter image description here

如果约翰名字重复:

enter image description here

爱丽丝名字重复的情况

enter image description here

更新的代码:

Sub test()

Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets("Sheet1")
Dim cs As Worksheet
    Dim mycell As Range, RANG As Range, Mname As String, Rng As Range


Dim r As Range, dict As Object
    Set dict = CreateObject("Scripting.Dictionary")
    With Sheets(1)
        ' Build a range (RANG) between cell F2 and the last cell in column F
        Set RANG = Range(.Cells(2, "A"), .Cells(.Rows.Count, "A").End(xlUp))
    End With


    ' For each cell (mycell) in this range (RANG)
    For Each mycell In RANG
        Mname = mycell.Value
        ' If the count of mycell in RANG is greater than 1, then set the value of the cell 1 across to the right of mycell (i.e. column G) as "Duplicate Found"
        If Application.WorksheetFunction.CountIf(RANG, mycell.Value) > 1 Then


        If dict.Count > 0 And dict.Exists(Mname) Then
        dict(Mname) = mycell.Row()
        Else
        dict.Add Mname, mycell.Row()
        End If

        End If
    Next mycell

Dim StartRow As Long
StartRow = 2

Dim Key As Variant
Dim lr As Long, v As Variant
For Each Key In dict.Keys
    Set Rng = ws.Range("A" & StartRow & ":A" & dict(Key))
    lr = dict(Key)
    v = dict.Keys               'put the keys into an array

    'Create 3 Sheets, move them to the end, rename
    'Loop through each name in array
    For Target = LBound(v) To UBound(v) - 1 '<-------why is Target always 0 here?
       'Loop through each row
        For i = StartRow To lr
            'Create Union of target rows
            If ws.Range("A" & i) = v(Target) Then
                If Not CopyMe Is Nothing Then '<---object required error at If Not copyme...
                    Set CopyMe = Union(CopyMe, ws.Range("A" & i))
                Else
                    Set CopyMe = ws.Range("A" & i)
                End If
            End If
        Next i

        StartRow = dict(Key) + 1
        'Copy the Union to Target Sheet
        If Not CopyMe Is Nothing Then
            Mname = "Name" & CStr(Target + 1)
            CopyMe.EntireRow.Copy Destination:=ThisWorkbook.Sheets(Mname).Range("A1")
            Set CopyMe = Nothing
        End If
    Next Target
Next Key

End Sub

使用字典作为起始行,使用另一个字典作为结束行。然后可以直接确定每个名称的重复行的范围并将其复制到新工作表中。

Sub CopyDuplicates()

    Dim wb As Workbook, ws As Worksheet
    Dim irow As Long, iLastRow As Long

    Dim dictFirstRow As Object, dictLastRow As Object, sKey As String
    Set dictFirstRow = CreateObject("Scripting.Dictionary") ' first row for name
    Set dictLastRow = CreateObject("Scripting.Dictionary") ' last row for name

    Set wb = ThisWorkbook
    Set ws = wb.Sheets("Sheet1")
    iLastRow = ws.Range("A" & Rows.Count).End(xlUp).Row

    ' build dictionaries
    For irow = 1 To iLastRow
        sKey = ws.Cells(irow, 1)
        If dictFirstRow.exists(sKey) Then
           dictLastRow(sKey) = irow
        Else
           dictFirstRow.Add sKey, irow
           dictLastRow.Add sKey, irow
        End If
    Next

    ' copy range of duplicates
    Dim k, iFirstRow As Long, rng As Range, wsNew As Worksheet
    For Each k In dictFirstRow.keys

        iFirstRow = dictFirstRow(k)
        iLastRow = dictLastRow(k)

        ' only copy duplicates
        If iLastRow > iFirstRow Then
            Set wsNew = wb.Worksheets.Add(after:=wb.Sheets(wb.Sheets.Count))
            wsNew.Name = k

            Set rng = ws.Rows(iFirstRow & ":" & iLastRow).EntireRow
            rng.Copy wsNew.Range("A1")
            Debug.Print k, iFirstRow, iLastRow, rng.Address
        End If
    Next

    MsgBox "Done"

End Sub

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 VBA 中根据 A 列重复名称将整个行复制到其各自的工作表? 的相关文章

  • 如何在 C# 中将 excel ListObject 添加到给定工作表?

    我目前正在 C 中开发一个 Excel 插件 其中包含多种方法 表值函数 可供 Excel 用户和程序员 VBA 使用 如何编写一个方法 将新的 ListObject Excel 表 添加到给定的 Excel 工作表 并将给定的 DataT
  • 在 Objective-C (iPhone) 中从 Excel 文件读取数据 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我在 google 中搜索过 但似乎没有找到从 Objective C 读取 Excel 文件的方法 我找到的唯一答案是首先转换为 CSV
  • 使用 SAS 导出到 Excel

    假设我有 2 个 SAS 数据集 test1 sas 和 Test2 sas 现在我想将这2个数据集导出到Excel中 其中Excel文件Sheet1中将有test1 sas数据 Sheet2中将有test2 sas数据 怎么做 从 开始这
  • 在 C# 中更改 Excel 单元格格式

    如何使用 C 中的 Microsoft Excel 12 0 库更改 Excel 中单元格的格式 更具体地说 我想将给定单元格更改为文本格式 我读过了 net c 改变Excel单元格格式 https stackoverflow com q
  • 带有 For 循环的多维数组 VBA

    尝试检查第一列中的值 即多维数组中的列 如果它匹配 则对另一列中与该行匹配的值进行排序 我认为我做错了 但这是我第一次搞乱多维数组 我是否需要在每个 for 循环中使用 UBound 和 LBound 来告诉它要查看哪一列 除了当前问题的答
  • VBA 下标超出工作簿名称范围

    我从网上拉了一些代码来打开文件夹中的最新文件 这似乎工作得很好 然而 在代码的后面 我添加了一行附加行来设置最近打开的同一文件 尝试此操作时 工作簿 subscipt 超出范围 我认为这与语法有关 可能需要在工作簿名称中添加额外的引号 有什
  • 有没有一种方法可以通过对一列求和并基于另一列来提取数据

    我正在尝试按帐户按月汇总金额 并将结果按帐户显示在另一个单元格中 AND E1 gt MONTH E1 E8 SUMPRODUCT F 1 F 8 gt MONTH E1 E8 6 D 1 F 8 D1 gt 0 6 Account Amo
  • 连接两列之间的排列

    我需要有关 Excel 作业的帮助 Name City John London Maxx NY Ashley DC Paris 解决这个问题的方法必须是 John london John NY John DC John Paris Maxx
  • 使用 VBA 在另一个 Access 实例中打开特定窗体

    所以我在这里四处查看并找不到我的问题的答案 至少不完全是 案例如下 我在 DBase1 中 想要单击一个按钮并在单独的访问实例中打开 DBase2 中的 NeuSteckbrief 表单 我设法使用以下代码在单独的实例中打开 DBase2
  • Excel VBA 选择.替换,如果替换,则将文本放在替换行的 a 列中

    我有一些宏 例如 Columns F M Select Selection Replace What Replacement LookAt xlPart SearchOrder xlByRows MatchCase True SearchF
  • 更改使用 ClosedXML 显示的工作表

    我正在使用 ClosedXML 动态创建包含多个工作表的 Excel 工作簿 生成内容后 我正在努力将所选工作表更改回工作簿中的第一个工作表 并且在文档中找不到有关如何更改显示的工作表的任何内容 我努力了 wb Worksheet 1 Se
  • VBA:删除数组项后减少循环迭代?

    在 Excel 的 VBA 中 For i 0 To UBound artMaster For j i To UBound artMaster If i lt gt j And artMaster i VDN artMaster j VDN
  • 有没有办法设置一个变量一次并在多个地方使用它而不给它模块级别的范围?

    我有一个循环将用户窗体控件添加到集合中 由于多个地方都需要该集合 因此我将其放入模块中并在需要时调用它 这意味着该集合仅在需要时才位于内存中 但这也意味着我每次想要使用它时都会运行一个循环 I could已给出集合模块级别范围并在第一次需要
  • 如何刷新幻灯片放映中的活动幻灯片?

    基于我的最后一个问题 https stackoverflow com questions 14503054 change the image of an image shape我得到了正确的代码来更改形状的图像 不幸的是 这不会更新活动演示
  • Excel 2013 COM API 在服务帐户下挂起 ExportAsFixedFormat

    我有一个 NET Windows 服务 它调用 Excel 2013 COM API 以在 PDF 上导出 Excel 文档 我已尝试使用在两个不同域帐户下运行的 Windows 服务来执行此代码 这两个帐户都是运行代码的计算机上的本地管理
  • 在函数上使用子例程的目的

    我已经使用 Access 一段时间了 尽管我了解 Function 相对于 Sub 的明显好处是它可以返回值 但我不确定为什么我应该使用 Sub 而不是一个函数 毕竟 除非我弄错了 函数可以做所有 Subs 可以做的事情吗 注意 我完全知道
  • 有没有任何方法可以使用 openpyxl 获取 .xlsx 工作表中存在的行数和列数?

    有没有任何方法可以使用 openpyxl 获取 xlsx 工作表中存在的行数和列数 在xlrd中 sheet ncols sheet nrows 将给出列数和行数 openpyxl中有这样的方法吗 给定一个变量sheet 可以通过以下方式之
  • 使用 Apache POI 和 Java 创建 Excel (.xlsx) 文件后文件损坏

    我已经使用 Apache POI API 使用 Java 成功创建了 xlsx 格式的工作簿 Excel 我的代码如下 在 D 盘创建一个名为 RiponAlWasim xlsx 的文件 Workbook wb new XSSFWorkbo
  • Excel VBA - 循环文件夹中的文件、复制范围、粘贴到此工作簿中

    我有 500 个包含数据的 Excel 文件 我会将所有这些数据合并到一个文件中 实现此目标的任务列表 我想循环遍历文件夹中的所有文件 打开文件 复制此范围 B3 I102 将其粘贴到活动工作簿的第一张工作表中 重复但在下面粘贴新数据 我已
  • 如何用xlrd读取公式

    我正在尝试做一个解析器 它读取几个 Excel 文件 我通常需要位于行底部的值 您可以在其中找到所有上部元素的总和 因此 单元格值实际上是 sum 或 A5 0 5 可以说 对于使用 Excel 打开此文件的用户来说 它看起来像一个数字 这

随机推荐

  • 使用 EditText 突出显示 Textview

    我目前正在为 Android 制作一个类似搜索引擎的应用程序 我想突出显示从 edittext 到 textview 的搜索单词 这是我到目前为止得到的 它只突出显示 textview 中的第一个单词 TV setText Hello Wo
  • Rails - json 设备请求的“警告:无法验证 CSRF 令牌真实性”

    如何检索 CSRF 令牌以通 过 JSON 请求传递 我知道出于安全原因Rails 正在检查 CSRF 令牌所有请求类型 包括 JSON XML 我可以放入我的控制器skip before filter verify authenticit
  • 如何在 Windows Phone 7 设备上拍摄位图图像并另存为 JPEG 图像文件?

    我正在寻找创建一个需要一个函数BitmapImage并将其以 JPEG 格式保存在本地 Windows Phone 7 设备上的独立存储中 static public void saveImageLocally string barcode
  • URL 中的哈希字符(在 Apache 中访问和重定向)

    看起来这个问题已经被其他一些人部分地问过 但我找不到我正在寻找的答案 所以我想我会提出我的特定场景 以防有人能够提供帮助 我们有一个旧网站 由第三方外部开发 即将退役 并由内部设计的新网站取代 由于他们最了解的原因 旧站点的开发人员使用哈希
  • 使用WCF在两个winform应用程序之间通信?

    我有两个不同的winform应用程序 App1和app2 App1调用app2的exe 使用DOS命令窗口 并发送消息来启动app2 app2 开始执行 一旦完成任务 它就会向 app1 发送执行成功的消息 我如何使用 WCF 实现此功能
  • 在 PyQt GUI 中嵌入和更新 matplotlib 图形时出现内存泄漏

    我正在尝试将每秒更新一次的 matplotlib 图嵌入到 PyQt GUI 主窗口中 在我的程序中 我每秒调用一个更新函数threading Timer通过timer函数如下所示 我有一个问题 我的程序每秒都在变大 大约每 4 秒 1k
  • 子查询出现问题,字段不存在,但优点是给我结果

    我有一个关于优势子查询的问题 当我分析几个 SQL 查询时 我偶然发现了一个奇怪的情况 当我执行以下 SQL 时 得到以下结果 select from orderlyn where OLWArtnr in select OlwArtnr f
  • 在 C# 中执行批处理文件

    我正在尝试用 C 执行批处理文件 但没有成功 我在互联网上找到了多个这样做的例子 但它对我不起作用 public void ExecuteCommand string command int ExitCode ProcessStartInf
  • jQuery 覆盖 $.post 函数

    首先 我为我糟糕的英语道歉 希望有人能理解我的问题并帮助我 我正在开发一个使用大量 post 调用的项目 我想通过为所有调用添加相同的验证来改进它们 我不想一一更改所有脚本 那么有没有办法覆盖 post 函数以同时向所有脚本添加相同的内容
  • 如何在 Android 中使用选项卡小部件? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 谁能告诉我如何制作tab widget在安卓中 有一个开发人员指南展示了如何实现选项卡式活动 片段http developer android co
  • 用于浮点阈值操作的 SIMD

    我想让一些向量计算更快 并且我相信用于浮点比较和操作的 SIMD 指令可以有所帮助 操作如下 void func const double left const double right double res const size t si
  • Django 用不同的字段注释计数

    我有两个松散定义的模型 如下所示 class InformationUnit models Model username models CharField max length 255 project models ForeignKey P
  • 使用Python解析Gmail并将所有早于日期的内容标记为“已读”

    长话短说 我创建了一个新的 Gmail 帐户 并将其他几个帐户链接到它 每个帐户都有 1000 条消息 我正在导入这些帐户 所有导入的消息均以未读状态到达 但我需要它们显示为已读 我对 python 有一点经验 但我只使用 mail 和 i
  • 如何在#include 上将库名称放在头名称之前?

    我正在使用 cmake 编译具有以下结构的项目 Root LibA inc src LibB inc src main cpp 我在每个 LibX 每个 src 和 Root 文件夹上都有 CMakeLists 我的项目正在按预期编译和运行
  • 正则表达式匹配不包含所有指定元素的字符串

    我想找到一个正则表达式来匹配不包含所有指定元素的字符串 无论它们的顺序如何 例如 给定以下数据 one two three four one three two one two one three four 传递话语two three正则表
  • pip 抛出“TypeError: deprecated() ”错误

    我正在尝试安装一些软件包并开始出现错误 然后在ubuntu中使用多个命令更新一些东西 但错误是相似的 pip install U pip setuptools or python3 m pip install upgrade pip or
  • 来自现有文件的 NetBeans GUI 生成器

    我是 NetBeans IDE 的新手 我正在使用 NetBeans GUI 构建器来创建 GUI 我通过右键单击包并单击 新建 然后单击新的 JFrame 表单来创建一个新文件 它运行良好 但我有一个带有 JFrame 的 java 文件
  • 在 Django 模板中渲染外部定义的块

    我正在为 Django 编写一个简单的类似博客的应用程序 并试图获得首页帖子限制为 5 个的效果 并具有一次列出大约 100 个帖子的综合存档 100不现实 只是扔一个数字 由于博客文章块在两个页面之间看起来完全相同 减去显示的数量 因此我
  • django boto3:NoCredentialsError - 无法找到凭据

    我正在尝试使用boto3在我的 django 项目中将文件上传到 Amazon S3 凭证定义在settings py AWS ACCESS KEY xxxxxxxx AWS SECRET KEY xxxxxxxx S3 BUCKET xx
  • 如何在 VBA 中根据 A 列重复名称将整个行复制到其各自的工作表?

    我当前的代码将尝试使用 VBA 将基于列 A 重复名称的整行复制到其各自的工作表 如下所示 但它只适用于第一个重复的名称 而不适用于其余的名称 当我检查我的代码时 我意识到我的目标 在目标 Lbound到Ubound部分的部分 始终为0 所