vba - 使用具有“动态创建名称”的变量

Posted

技术标签:

【中文标题】vba - 使用具有“动态创建名称”的变量【英文标题】:vba - Use a variable with a "dynamic created name" 【发布时间】:2022-01-16 03:43:44 【问题描述】:

我希望你能帮助我提出一个疯狂的想法。我不确定这是否可能,我什至不知道如何称呼它。

我想使用一个变量来动态建立它的名字。

这可能吗?

我正在逐行读取一个 html 文件,我的代码需要知道在哪个工作表中存储当前行。 我有大约 10 张纸,但对于这个问题,我只会使用两张纸:Module 和 Switch。 对于每张工作表,我都有一个“WhateverSheetRow”变量来记录更新的行。在此示例中:ModuleRow 和 SwitchRow。 我的想法是,因为我在每张工作表的每一行中都写,我知道哪一行是最后更新的,所以在下一次出现时,我会将它增加 1 并更新它,而不是使用 find 或任何其他“最后空行”更新方法。 有没有办法将 WhatSheetRow 增加 1 以动态构建变量名?

Dim ModuleRow as Long
Dim SwitchRow as Long
Dim Found as String
If Found = "Module" Then             'String found is Module
Found & "Row" = Found & "Row" + 1    'Increase ModuleRow by one
Sheets(Found).Range("A" & (ModuleRow)).Value = "Y"

所以问题是是否有办法“构建”变量名并使用它。

或者什么是更好的选择?

非常感谢!

【问题讨论】:

你能提供一个视觉例子来说明你在说什么吗?我假设你知道你可以做到moduleRow=ModuleRow +1? 如果我正确理解了您的要求,我认为公共变量应该可以解决您的问题。 阅读数组、集合和脚本字典。您可能还会发现学习基本的 VBA 教程可能会有所帮助,因为您的问题表明严重缺乏编程基础知识。 @freeflow :) 不是真的。 【参考方案1】:

您可以在其他一些languages 中使用那个(坏的)想法,但不能在 VBA 中使用。使用数组或字典。如果您要更改脚本中工作表的数量或位置,请使用字典。

Option Explicit

Sub demo()

    Dim wb As Workbook, ws As Worksheet
    Set wb = ThisWorkbook
    
    ' using an array
    Dim arLastRow() As Long
    ReDim arLastRow(1 To wb.Sheets.Count)
    For Each ws In wb.Sheets
        arLastRow(ws.Index) = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
    Next
    
    ' set found
    Dim Found As String
    Found = "Module" ' or Switch or any other sheet name
    With wb.Sheets(Found)
       arLastRow(.Index) = arLastRow(.Index) + 1
        .Cells(arLastRow(.Index), "A") = "Y"
    End With
    
    ' or using a dictionary
    Dim dictLastRow As Object
    Set dictLastRow = CreateObject("Scripting.Dictionary")
    For Each ws In wb.Sheets
        dictLastRow(ws.Name) = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
    Next
       
    ' set found
    Found = "Switch" ' or Module or any other sheet name
    With wb.Sheets(Found)
        dictLastRow(.Name) = dictLastRow(.Name) + 1
        .Cells(dictLastRow(.Name), "A") = "Y"
    End With
End Sub
 

【讨论】:

感谢您的回答。我试图避免 .End(xlUp) 因为我拥有的数据量非常慢。我一直在努力解决一些问题,但看起来我需要在代码的其他地方寻找效率。我会试试你的代码。再次感谢您的帮助。 @Rodgrigo .End(xlUp) 只为子开头的每个工作表运行一次以查找任何现有行,如果您的工作表是空的,那么您可以将其替换为您想要开始的行号在。

以上是关于vba - 使用具有“动态创建名称”的变量的主要内容,如果未能解决你的问题,请参考以下文章

具有多个标准排名的 Excel VBA 动态数据验证下拉列表

如何在工作表中动态创建具有列数的数组,以删除多列中的重复项

EXCEL VBA - 根据单元格范围和字符串创建动态下拉列表[关闭]

如何在 VBA 中创建具有动态行源的列表框

Access 2010中使用VBA创建动态表

具有变量名称的 Excel VBA 调用函数