#excel #vba
Вопрос:
Я пытаюсь добавить «#» в каждую ячейку в первом столбце с строки 7, пока ячейка не станет пустой. И у меня есть несколько файлов в одной папке, которые нужно повторить. Возможно ли это сделать с помощью VBA? Это всегда показывало, что с кодом что-то не так. Большое спасибо за помощь.
Sub LoopAllFilesInAFolder()
'Loop through all files in a folder
Dim fileName As Variant
fileName = Dir("C:Users)
While fileName <> ""
'Insert the actions to be performed on each file
Dim last As Long
Dim i As Long
'Find the last row with values in Column A
last = .Cells(.Rows.Count, 1).End(xlUp).Row
'Loop from the 7th row to the last row.
For i = 7 To last
'Assign the value
Cells(i, 1).Value = "#" amp; Cells(i, 1).Value
Next i
'This example will print the file name to the immediate window
Debug.Print fileName
'Set the fileName to the next file
fileName = Dir
Wend
End Sub
Комментарии:
1. Да, это так… Что вы пробовали самостоятельно? Что это за «файлы»?
2. Все они xlsx.
3. Затем вы должны открыть их, во-первых, во-вторых, имя файла не имеет
.cell
свойства и так далее…4. Спасибо, Фэйн, постараюсь во всем разобраться.
Ответ №1:
Пожалуйста, попробуйте следующий адаптированный код:
Sub LoopAllFilesInAFolder()
Dim folderName As String, fileName As String, wb As Workbook
Dim ws As Worksheet, last As Long, i As Long, arr
folderName = "C:UsersLin.YuDesktopNewFolder" 'take care to the ending backslash
fileName = Dir(folderName amp; "*.xlsx")
While fileName <> ""
Set wb = Workbooks.Open(folderName amp; fileName)
Set ws = wb.Sheets(1) 'use here the appropriate sheet, if not the first one
With ws
'Find the last row with values in Column A
last = .cells(.rows.count, 1).End(xlUp).row
arr = .Range("A1:A" amp; last).value 'put the column in an array to make the code faster
'Loop from the 7th array row to the last row and process.
For i = 7 To UBound(arr)
arr(i, 1) = "#" amp; arr(i, 1)
Next i
.Range("A1:A" amp; last).value = arr 'drop the processed array content
End With
wb.Close True 'save and close the processed workbook
'Set the fileName to the next file
fileName = Dir
Wend
End Sub
Отредактированный:
Пожалуйста, протестируйте следующий компактный вариант, используя оценку вместо итерации:
Sub LoopAllFilesInAFolder()
Dim folderName As String, fileName As String, wb As Workbook
Dim ws As Worksheet, last As Long, i As Long, rng As Range
folderName = ThisWorkbook.path amp; "" ' "C:UsersLin.YuDesktopNewFolder"
fileName = Dir(folderName amp; "*.xlsx")
While fileName <> ""
Set wb = Workbooks.Open(folderName amp; fileName)
Set ws = wb.Sheets(1) 'use here the appropriate sheet, if not the first one
With ws
'Find the last row with values in Column A
last = .cells(.rows.count, 1).End(xlUp).row
Set rng = .Range("A7:A" amp; last)
rng.value = Evaluate("""#""amp;" amp; rng.Address)
End With
wb.Close True 'save and close the processed workbook
'Set the fileName to the next file
fileName = Dir
Wend
End Sub
Комментарии:
1. Спасибо, Фэйн. Я попробовал его, однако он показал «несоответствие типа». Как я могу с этим справиться? Я новичок в VBA. Спасибо!
2. @Салли На какой линии? Вы использовали код именно так, как он есть? ИБП… Я мог видеть ошибку. Я немедленно исправлю это. Пожалуйста, протестируйте обновленный код.
3. Я использую точно такой же код, как и выше. Я попробовал во второй раз. Больше не отвечаю….
4. @Салли, ты пробовала обновить страницу (эту)? Возможно, вы не используете обновленный код… Вы получаете ту же ошибку? Если да, то по какой линии? Я не проверял код. Это просто, и я думаю, что это легко понять.
5. Хорошо. Я попробую еще раз. Тнх
Ответ №2:
Кажется, ты показываешь две вещи:
- Код для поиска всех файлов, которые вы хотите обработать.
- Код, который вы хотите применить к книге в этих файлах.
Чего вы не сделали, так это не создали книгу VBA на основе найденных вами файлов. Это объясняется в этом URL-адресе.
Комментарии:
1. Спасибо, Доминик. Я попробую еще раз. 😀