考虑一下这个场景:我有一个在服务器上有两个网络共享的客户端。每个共享包含代表每个项目的相同文件夹列表(一个用于当前数据,另一个用于存档数据)。每个项目文件夹都包含一组匹配的文件夹和子文件夹,它们需要分配各自的权限。当然,项目是不时添加和删除的。
我想在Excel中维护一个项目列表,以及需要为每个项目文件夹及其所有子文件夹设置的权限列表。我的想法是在Excel中每行排列一个命令,每行代表一个子文件夹。然后使用for循环复制这些命令,将共享文件夹和项目文件夹添加到目录路径中。输出将是一个批处理文件,我可以在需要更改或更新权限的任何时候运行该文件。
编辑:我从未在Excel中使用过VBA,搜索后似乎找不到如何在for循环中使用变量来更改工作表中引用的单元格。我已经有一段时间没有写任何程序了,但当我用C编程时,我记得我能够使用for循环中的变量来引用列表/表中的单元格。当for循环经过迭代时,变量将计数,从而更改它们引用的列表中的哪个单元格。为了在Excel中表达这一点,我希望每个for循环中的变量都是行号,并且我将静态地分配列字母,因为这不会随着每次迭代而改变。
每次运行for循环时,我都希望它将一系列单元格连接到一个文本字符串中,该字符串输出到文本文件的新行。串联将把在每个循环中保持不变的一些单元格和随着变量增加而变化的其他单元格联系在一起。例如,我想连接单元格A1、B1、Ci、Dj、E1、Fk,其中I、j和k表示用于计算每个For循环的迭代次数的整数的数值。
你能告诉我用可变单元格赋值实现串联的正确语法是什么吗?这是我的代码摘录。
For i = 2 To numberOfSharedFolders
'Loops for every subfolder (project folder) in the shared folder that needs permissions set
For j = 2 To numberOfSubfolders1
'Loops for every entry of permissions on final folders
For k = 2 To numberOfSubfolders2
concatenatedDataString = ActiveSheet.Range("A1") & ActiveSheet.Range("B1") & ActiveSheet.Range("C"i) & ActiveSheet.Range("D"j)
Write #1, concatenatedDataString
Next k
Next j
Next i
.B3
不是ActiveSheet
对象的方法或属性。
我怀疑你打算进行ActiveSheet.Range("B3")
可能会有更多的错误,事实上,接下来的两行可能会引发相同的错误。
可能还有更多,例如,请注意此语句中的拼写错误,它将引发424 Object Required错误(因为Appleication
不是对象,它被视为未定义/未声明的变量,具有空值):
filePath = Appleication.DefaultFilePath & "icacls Commands.bat"
您可以在每个模块的顶部使用Option Explicit
来帮助调整拼写错误(这将导致任何未定义变量的编译错误,拼写错误被解释为未定义变量。
对于你剩下的问题(实际上你问了6个相当宽泛的问题),我会尽量简短地回答,但不会真正接受冗长的问答;评论中的A或讨论。如果您有具体问题,应单独询问(在您完成搜索/故障排除等尽职调查后)。
我应该如何在for循环中连接?
不知道你的意思。通过将某个值附加到现有字符串上来连接循环。使用&
运算符而不是+
运算符,因为后者可能会被非字符串数据混淆(即,"hello" & 1
不会引发错误,但"hello" +1
会引发不匹配)。
Dim i as Integer
Dim s as String
s = "some words"
For i = 1 to 10
s = s & some_other_variable
Next
事实上,你的代码并没有连接任何字符串——它只是添加整数:
concatenatedDataSting = i + j + k
i
、j
和k
都是整数数据。这不是在创建一个字符串(或者,如果是,它是一个表示该操作的数字和的强制/隐含字符串)。
有没有更好的方法来设置for循环的变量?目前,我有一个使用countif(D:D,"*")计算每列大小的单元格,并将其分配给一个变量。
WHat变量?在上面的代码中,我没有看到任何对D列或CountIf
函数的引用。
引用工作表中数据的最佳方式是什么?范围()?currentsheet.range()?
这取决于您所说的"工作表中的数据"的含义。不清楚,太宽泛,无法回答。
如何执行此程序?在开发者控制台中点击播放?
从开发人员功能区的"宏"菜单中,从ThisWorkbook(或其所在的任何一本书)中选择宏。然后跑。或者从控制台/VBE,按F5或"Run"(运行)按钮。
我如何知道文本文件的最终位置?默认位置是"我的文档"吗?
一旦你纠正了打字错误,它就会出现在这里:
Application.DefaultFilePath
您可以这样做来查看它的位置:MsgBox Application.DefaultFilePath
我完成了所有工作。我的代码在下面。阅读原始问题,了解更多有关此功能的信息。
子表1Compile()
'Create variables used in for loops
Dim numberOfSharedFolders As Integer
Dim numberOfSubfolders1 As Integer
Dim numberOfSubfolders2 As Integer
Dim i As Integer
Dim j As Integer
Dim k As Integer
'Set values of variables to the number of rows in each column.
'Note that the value includes the column titles in row 1
numberOfSharedFolders = ActiveSheet.Range("B2")
numberOfSubfolders1 = ActiveSheet.Range("B3")
numberOfSubfolders2 = ActiveSheet.Range("B4")
'Create text file to output of data from for loop
Dim filePath As String
filePath = Application.DefaultFilePath & "icacls Commands.txt"
Open filePath For Output As #1
'Loops for every row in the first mentioned column (except the first row which contains column labels)
'Initializing to 2 instead of 1 so that the loop will skip the first row which is just column labels. Not setting it to 0 since there is no row 0
For i = 2 To numberOfSharedFolders
'Loops for every row in the second mentioned column (except the first row which contains column labels)
For j = 2 To numberOfSubfolders1
'Loops for every row in the third mentioned column (except the first row which contains column labels)
For k = 2 To numberOfSubfolders2
'Print the concatendated text to the output file. Print is used instead of "write" so that it doesn't produce unwanted quotation marks.
Print #1, ActiveSheet.Cells(2, 3) & ActiveSheet.Cells(i, 4) & ActiveSheet.Cells(j, 5) & ActiveSheet.Cells(1, 6) & ActiveSheet.Cells(k, 7) & ActiveSheet.Cells(1, 8) & ActiveSheet.Cells(k, 9)
Next k
Next j
Next i
Close #1
End Sub