mysql - 如何根据 VBA 中命名的开始和结束单元格选择一系列单元格?

标签 mysql vba excel csv

我将数据从 MySQL 数据库中提取到工作表中,方法是将其另存为 csv 并将该 csv 数据粘贴到工作表中。此 csv 包含所有客户端的所有数据,由如下所示的标记单元格分隔:“Client1:START”和“Client1:END”。然后我运行一个复制两页的宏:一个包含来自聚合表的各个客户的数据,另一个包含运行该数据的图表。

我几乎完成了所有工作:复制所有页面并更新图表中的引用以及从该客户的数据表中提取信息的单元格。

剩下要做的唯一一件事就是将聚合表中的数据复制到每个客户的表中。我想了很多,这似乎是最简单的方法,因为我不知道将为给定客户端生成的行数(0 到 31 之间的任何值,因为这是每月一次报告)是在该客户第一行之前的行的第一个单元格中包含“Client1:START”,在之后的行的第一个单元格中包含“Client1:END”。

然后我可以简单地搜索单元格直到找到这两个单元格,为它们命名(因为我还不知道如何在变量中保存单元格地址),然后以某种方式偏移它们以获得我想要的实际范围想要,减去标记。

然后我可以复制该范围并将其粘贴到新创建的数据表中。

实际上,我什至还没有达到抵消的程度。我仍在努力尝试根据名称选择单元格。这是我的:

Dim Client
Dim SelectedCell
Dim StartCell
Dim EndCell

For Each Client In Array("Client1", "Client2")

    StartCell = Client & "StartCell"
    EndCell = Client & "EndCell"

    Sheets("ALL-DATA").Select
    For Each SelectedCell In Range("A1:D20")
        If SelectedCell.Value = Client & ":START" Then
            SelectedCell.Name = StartCell
        End If
        If SelectedCell.Value = Client & ":END" Then
            SelectedCell.Name = EndCell
        End If
    Next SelectedCell

    Range(StartCell & ":" & EndCell).Select  '<-- This won't compile
Next Client

那个范围不允许我选择使用变量,所以我有点卡住了。看来 VBA 只允许您使用地址字符串选择一个范围。

如果有人能指出正确的方向,我将不胜感激。如果您知道我如何调整选择以排除实际标记(考虑到数据长度为零行的可能性),那将是非常棒的,也是一笔巨大的收获。

谢谢!

最佳答案

由于我在上面评论中提到的多种原因,此代码无法编译。我相信下面这个会起作用。您应该养成总是声明您的变量并使用 Option Explicit 来防止拼写错误等的习惯。

  • 您需要一种获取单元格地址的方法,即通过引用它的 .Address 属性 :) 单元格和范围没有 .Name 属性,因此您的代码实际上会在 SelectedCell.Name = StartCell 行失败
  • 你的赋值语句是反的。为了 StartCell 变量,该变量必须位于赋值语句的左侧,并且如果它需要表示一个对象像单元格/范围,那么您还必须使用 Set 关键字,即 Set StartCell = Range("A1")

我也将其更新为 avoid any use of Select method 。 99.9% 的时间都不需要 SelectActivate Excel 中的任何内容。

Dim Client as Variant
Dim SelectedCell as Range
Dim StartCell as Range
Dim EndCell as Range
Dim ClientRange as Range

For Each Client In Array("Client1", "Client2")

    For Each SelectedCell In Sheets("ALL-DATA").Select.Range("A1:D20")
        If SelectedCell.Value = Client & ":START" Then
            Set StartCell = SelectedCell
        ElseIf SelectedCell.Value = Client & ":END" Then
            Set EndCell = SelectedCell
        End If
    Next SelectedCell

    Set ClientRange = Sheets("ALL-DATA").Range(StartCell.Address & ":" & EndCell.Address)
Next Client

现在您已将 ClientRange 限定为属于“所有数据”工作表,通常无需出于任何原因选择或激活它。这样做只会给代码增加不必要的操作和复杂性,并降低其性能。

关于mysql - 如何根据 VBA 中命名的开始和结束单元格选择一系列单元格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25151243/

相关文章:

php - 如何将我的 php 文件转换为 utf8?

mysql - 构建具有未知列数的sql表的最佳方法

excel - 使用 xlToLeft 设置范围在第 256 列后失败

excel - 如何在 Excel VBA 中将一系列单元格设置为 If 语句的条件

javascript - 如何在 Node js 中写入 xls 文件和流以响应

excel - 在 Excel 中复制范围时出现运行时错误 6

Mysql分区和连接

企业版Mysql社区版

excel - 防止循环更新所有子字典值

vba - Excel VBA 中的高效小写字母