Конкатенация в 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