Конкатенация в Excel For Loop для создания командного файла команд

Рассмотрим следующий сценарий: у меня есть клиент, у которого есть два сетевых ресурса на сервере. Каждая папка содержит идентичный список папок, представляющих каждый проект (одна для текущих данных, а другая для архивированных данных). Каждая папка проекта содержит соответствующий набор папок и подпапок, которым необходимо назначить индивидуальные разрешения. Конечно, проекты добавляются и удаляются время от времени.

Я хотел бы сохранить список проектов в Excel вместе со списком разрешений, которые необходимо установить для каждой папки проекта, а также всех их подпапок. Моя идея состоит в том, чтобы выложить команды в Excel по одной в строке, где каждая строка представляет подпапку. Затем используйте циклы for для дублирования этих команд, добавляя в общую папку и папку проекта путь к каталогу. Выводом будет командный файл, который я могу запускать в любое время, когда необходимо изменить или обновить разрешения.

РЕДАКТИРОВАТЬ: Я никогда не использовал VBA в Excel, и после поиска я не могу найти, как использовать переменные в цикле for, чтобы изменить ссылки на ячейки в листе. Прошло много времени с тех пор, как я написал какую-либо программу, но когда я программировал на C I, помню, что я мог использовать переменные из циклов 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

2 ответа

Решение

Я получил всю эту работу. Мой код ниже. Прочитайте оригинальный вопрос для получения дополнительной информации о том, что это делает.

Sub 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

.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? В настоящее время у меня есть ячейка с общим размером каждого столбца, использующая счетчик (D:D,"*"), и я назначаю ее переменной.

Какая переменная? Я не вижу ссылок ни на столбец D, ни на CountIf Функция в вашем коде выше.

Как лучше всего ссылаться на данные в листе? Спектр()? currentsheet.range()?

Это зависит от того, что вы подразумеваете под "данными на листе". Неясно, слишком широк, чтобы ответить.

Как мне выполнить эту программу? Нажав кнопку воспроизведения в консоли разработчика?

В меню "Лента разработчика", "Макросы" выберите макрос из ThisWorkbook (или любой другой книги, в которой он находится). Тогда беги. Или из консоли /VBE нажмите F5 или кнопку "Выполнить".

Как я узнаю, где находится текстовый файл? Расположение по умолчанию Мои документы?

Это закончится здесь, как только вы исправите опечатку:

Application.DefaultFilePath

Вы можете сделать это, чтобы увидеть, где это: MsgBox Application.DefaultFilePath

Другие вопросы по тегам