0

考虑这种情况:我有一个在服务器上有两个网络共享的客户端。每个共享包含代表每个项目的相同文件夹列表(一个用于当前数据,另一个用于存档数据)。每个项目文件夹都包含一组匹配的文件夹和子文件夹,需要分配单独的权限。当然,项目会不时添加和删除。

我想在 Excel 中维护一个项目列表以及需要为每个项目文件夹及其所有子文件夹设置的权限列表。我的想法是在 Excel 中每行布置一个命令,每行代表一个子文件夹。然后使用 for 循环将这些命令复制到共享文件夹和项目文件夹中添加到目录路径。输出将是一个批处理文件,我可以在需要更改或更新权限的任何时候运行该文件。

编辑:我从未在 Excel 中使用过 VBA,搜索后我似乎无法找到如何在 for 循环中使用变量来更改工作表中的哪些单元格被引用。自从我编写任何程序以来已经有一段时间了,但是当我在 CI 中编程时,记得能够使用 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
4

2 回答 2

1

.B3不是ActiveSheet对象的方法或属性。

我怀疑你打算ActiveSheet.Range("B3")

可能还有更多错误,实际上接下来的两行可能会引发相同的错误。

可能还有更多,例如注意此语句中的拼写错误,这将引发 424 Object Required 错误(因为Appleication它不是对象,所以它被视为具有空值的未定义/未声明的变量):

filePath = Appleication.DefaultFilePath & "icacls Commands.bat"

您可以Option Explicit在每个模块的顶部使用来帮助规范拼写错误(这将引发任何未定义变量的编译错误,并且拼写错误被解释为未定义变量。

对于您的其余问题(实际上您是在问 6 个相当广泛的问题),我将尝试简要回答,但不会在此处的评论中真正接受冗长的问答或讨论。如果您有具体问题,应单独询问每个问题(在您完成搜索/故障排除/等方面的尽职调查之后)。

我应该如何在 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,"*") 计算每列大小的单元格,并将其分配给一个变量。

什么变量?我在上面的代码中没有看到对 D 列或CountIf函数的任何引用。

在工作表中引用数据的最佳方式是什么?范围()?currentsheet.range()?

这取决于您所说的“工作表中的数据”是什么意思。不清楚,太宽泛,无法回答。

我如何执行这个程序?通过在开发者控制台中点击播放?

从开发人员功能区的宏菜单中,从 ThisWorkbook(或它所在的任何书)中选择宏。然后运行。或者从控制台/VBE,按 F5 或“运行”按钮。

我怎么知道文本文件将在哪里结束?默认位置是我的文档吗?

一旦您更正了错字,它将在这里结束:

Application.DefaultFilePath

你可以这样做来看看它在哪里: MsgBox Application.DefaultFilePath

于 2014-10-15T03:19:14.683 回答
0

我得到了这一切的工作。我的代码如下。阅读原始问题以获取有关此功能的更多信息。

子 Sheet1Compile()

'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
于 2014-10-30T02:05:33.697 回答