Прошу помочь с макросом для excel, который ищет и копирует файлы в новую папку. Исходная папка содержит папку с названием, например, A1 (первого уровня), в которой находятся подпапки A11, A111, A1111 и т.д. В исходной папке много папок первого уровня с вложенными подпапками.
Макрос должен проверить, что название папки первого уровня начинается с латинской A-Z, если да, искать в такой папке и подпапках файлы XLSX, DOC или DOCX, у которых в имени есть "_RF" и нет "~". Найденные скопировать в новую подпапку "RF" с аналогичным названием A1, B1, C1 папки первого уровня с предварительной проверкой нет ли их, если нет, то создать.
У меня получился такой макрос, который сортирует папки по алфавитным подпапкам
Код
Sub Move_to_ABC_Folders()
Dim FSO As Object
Dim FromPath As String
Dim sbFolder As Object
FromPath = "R:\test"
Set FSO = CreateObject("scripting.filesystemobject")
For Each sbFolder In FSO.getfolder(FromPath).subFolders
If Len(sbFolder.Name) <> 1 Then
If FSO.FolderExists(FromPath & "\" & Left(sbFolder.Name, 1) & "\") = False Then
FSO.CreateFolder (FromPath & "\" & Left(sbFolder.Name, 1) & "\")
End If
sbFolder.Move FromPath & "\" & Left(sbFolder.Name, 1) & "\"
End If
Next sbFolder
End Sub
Подскажите, что не так в коде? Макрос должен переместить папки, которые начинаются на А, например, Арбуз, в папку "А". По факту, он ищет на всю глубину папки Арбуз и перемещает в "А" подпапки.
Код
Sub Move_to_ABC_Folders()
Dim FSO As Object
Dim FromPath As String
Dim sbFolder As Object
FromPath = "R:\test"
Set FSO = CreateObject("scripting.filesystemobject")
For Each sbFolder In FSO.getfolder(FromPath).subFolders
If sbFolder.Name Like "A*" Then
sbFolder.Move "R:\test\A"
End If
Next sbFolder
End Sub
Пытаюсь отладить макрос для изменения части гиперссылки из-за изменившихся названий папок, но что-то не так.
Вот сам макрос:
Код
Sub ProcessFiles()
Dim Filename, Pathname As String
Dim wb As Workbook
Pathname = "F:\! PROJECT\"
Filename = Dir(Pathname & "*.xlsx")
Do While Filename <> ""
Set wb = Workbooks.Open(Pathname & Filename)
DoWork
wb.Close SaveChanges:=True
Filename = Dir()
Loop
End Sub
Sub DoWork()
'Workbook("Renamer").
Dim xHyperlink As Hyperlink
For Each xHyperlink In Worksheets("Combine Sheet").Hyperlinks
For i = 2 To 280
xHyperlink.Address = Replace(xHyperlink.Address, Worksheets("old_new").Cells(i, 1) & "\", Worksheets("old_new").Cells(i, 2) & "\")
Next
Next
End Sub
Таблица "старое имя-новое имя папок" (old_new) находится в файле "Renamer", из которого запускаю макрос, а файлы со ссылками в папке F:\! PROJECT\. Гиперссылки находятся на листах "Combine Sheet".
При запуске открывается первый файл и программа выдает ошибку 9. Где может быть ошибка?
Добрый день. Помогите, пожалуйста, доработать макрос, чтобы на отдельные листы выводились списки файлов подпапок.
Код
Sub FileList()
Dim V As String
Dim BrowseFolder As String
'открываем диалоговое окно выбора папки
With Application.FileDialog(msoFileDialogFolderPicker)
.Title = "Выберите папку или диск"
.Show
On Error Resume Next
Err.Clear
V = .SelectedItems(1)
If Err.Number <> 0 Then
MsgBox "Вы ничего не выбрали!"
Exit Sub
End If
End With
BrowseFolder = CStr(V)
'добавляем лист и выводим на него шапку таблицы
ActiveWorkbook.Sheets.Add
With Range("A1:E1")
.Font.Bold = True
.Font.Size = 12
End With
Range("A1").Value = "Имя файла"
Range("B1").Value = "Путь"
Range("C1").Value = "Размер"
Range("D1").Value = "Дата создания"
Range("E1").Value = "Дата изменения"
'вызываем процедуру вывода списка файлов
'измените True на False, если не нужно выводить файлы из вложенных папок
ListFilesInFolder BrowseFolder, True
End Sub
Private Sub ListFilesInFolder(ByVal SourceFolderName As String, ByVal IncludeSubfolders As Boolean)
Dim FSO As Object
Dim SourceFolder As Object
Dim SubFolder As Object
Dim FileItem As Object
Dim r As Long
Set FSO = CreateObject("Scripting.FileSystemObject")
Set SourceFolder = FSO.getfolder(SourceFolderName)
r = Range("A65536").End(xlUp).Row + 1 'находим первую пустую строку
'выводим данные по файлу
For Each FileItem In SourceFolder.Files
Cells(r, 1).Formula = FileItem.Name
Cells(r, 2).Formula = FileItem.Path
Cells(r, 3).Formula = FileItem.Size
Cells(r, 4).Formula = FileItem.DateCreated
Cells(r, 5).Formula = FileItem.DateLastModified
r = r + 1
X = SourceFolder.Path
Next FileItem
'вызываем процедуру повторно для каждой вложенной папки
If IncludeSubfolders Then
For Each SubFolder In SourceFolder.SubFolders
ListFilesInFolder SubFolder.Path, True
Next SubFolder
End If
Columns("A:E").AutoFit
Set FileItem = Nothing
Set SourceFolder = Nothing
Set FSO = Nothing
End Sub
Спасибо, работает, как надо. Смысл в использовании гиперссылок для подтягивания через формулы нужной информации, которая будет отображаться во всплывающем окошке. Не подскажите, как сохранить начальное форматирование текста (bold) без отключения в глобальных настройках? При обновлении форматирование меняется на гиперссылку.
Помогите подправить макрос. Есть ячейка, в ней выпадающий список. Хочу, чтобы при изменении значения из списка в этой же ячейке прописывалась формула =HYPERLINK со значением из списка. Макрос в таком виде вешает Эксель
Код
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column <> 3 Then
Exit Sub
Else
ActiveCell.Formula = "=HYPERLINK("""",""" & ActiveCell.Text & """)"
End If
End Sub
Добрый день! Прошу подправить макрос, не работает в Excel 2010. По описанию должен вставлять в колонку А название cvs файлов, а в колонку В - их содержание, но выдает run time error '9'. Debug подсвечивает строку
Код
Dim wsMstr As Worksheet: Set wsMstr = ThisWorkbook.Sheets("MasterCSV")
Менял название листа на MasterCSV, но не помагает.
Код
Sub ImportCSVsWithReference()
'Author: Jerry Beaucaire
'Date: 10/16/2010
'Summary: Import all CSV files from a folder into a single sheet
' adding a field in column A listing the CSV filenames
Dim wbCSV As Workbook
Dim wsMstr As Worksheet: Set wsMstr = ThisWorkbook.Sheets("MasterCSV")
Dim fPath As String: fPath = "C:\2010\Import\" 'path to CSV files, include the final \
Dim fCSV As String
If MsgBox("Clear the existing MasterCSV sheet before importing?", vbYesNo, "Clear?") _
= vbYes Then wsMstr.UsedRange.Clear
Application.ScreenUpdating = False 'speed up macro
fCSV = Dir(fPath & "*.csv") 'start the CSV file listing
Do While Len(fCSV) > 0
'open a CSV file
Set wbCSV = Workbooks.Open(fPath & fCSV)
'insert col A and add CSV name
Columns(1).Insert xlShiftToRight
Columns(1).SpecialCells(xlBlanks).Value = ActiveSheet.Name
'copy date into master sheet and close source file
ActiveSheet.UsedRange.Copy wsMstr.Range("A" & Rows.Count).End(xlUp).Offset(1)
wbCSV.Close False
'ready next CSV
fCSV = Dir
Loop
Application.ScreenUpdating = True
End Sub
Помогите, пожалуйста, с макросом. Хочу вставить адрес в функцию ГИПЕРССЫЛКА выбором файла в окне, при этом уже существующий текст ячейки использовать в качестве имени гиперрсылки. Не могу прописать перевод адреса файла в функцию. Макрос так и вставляет в ячейку =HYPERLINK(txtFileName;ActiveCell.text)
Код
Private Sub hyperlink()
Dim fd As Office.FileDialog
Dim s As String
Set fd = Application.FileDialog(msoFileDialogFilePicker)
With fd
.AllowMultiSelect = False
.InitialFileName = "D:\Docs"
.Title = "Please select the file."
.Filters.Clear
.Filters.Add "PDF", "*.pdf"
If .Show = True Then
txtFileName = .SelectedItems(1)
End If
End With
ActiveCell.Formula = "=HYPERLINK(txtFileName,ActiveCell.text)"
End Sub
Уважаемые форумчане, подскажите, пожалуйста, макрос для вставки в ячейку ссылки на файл при совпадении текста в ячейке с частью названия файла. Например, AAAA1112 в ячейке ссылается на файл AAAA1112_2016_Amlodip.pdf Ячеек по листу много и файлов тоже (>1000) и они, возможно, расположены во вложенных папках. Можно сократить название до точного совпадения и переместить в одну папку, если это критично.
Добрый день уважаемые форумчане. Подскажите, как изменить код, чтобы функция делала вывод не в массив, а в виде строки с разделителем ";". Хочу ее использовать в качестве источника для выпадающего списка.
Код
' ZVI:2009-10-17 http://www.planetaexcel.ru/forum.php?thread_id=10602
' Функция возвращает одномерный массив уникальных отсортированных значений диапазона Rng
Function NoDups(rng As Range)
Dim arr(), i&, s$, x
' Считать данные в массив, для удобства ограничиться последней строкой данных листа
arr = Intersect(rng.Parent.UsedRange, rng).Value
' Создать список
On Error Resume Next
With New Collection
For Each x In arr()
s = Trim(x)
If Len(s) > 0 Then
If IsEmpty(.Item(s)) Then
For i = 1 To .Count
If s < .Item(i) Then Exit For
Next
If i > .Count Then .Add s, s Else .Add s, s, Before:=i
End If
End If
Next
' Скопировать из коллекции в массив
ReDim arr(1 To .Count)
For i = 1 To .Count
arr(i) = .Item(i)
Next
End With
' Вернуть массив
NoDups = arr()
End Function
Добрый день! Подскажите, можно ли преобразовать этот макрос в функцию отбора уникальных значений с сортировкой, которую можно использовать в качестве источника для выпадающего списка (Data-Data validation-List-Source:)?
Вот макрос
Код
Sub Unique_Sorted()
Application.ScreenUpdating = False
' удаляем из колонки В старые значения
Range("B1:B1000").Delete
' выбираем из колонки А уникальные и вставляем в колонку В начиная с ячейки В2
ActiveSheet.Columns("A:A").AdvancedFilter Action:=xlFilterCopy, _
CopyToRange:=ActiveSheet.Range("B2"), _
Unique:=True
' сортируем отобранные значения по алфавиту
ActiveSheet.Range("B2:B1000").Sort Key1:=ActiveSheet.Range("B2:B1000"), _
Order1:=xlAscending, Header:=xlNo, OrderCustom:=1, _
MatchCase:=False, Orientation:=xlTopToBottom
' удаляем заголовок, если он дублирует первое значение уникального списка
If Range("B2") = Range("B3") Then
Range("B2").Delete Shift:=xlUp
End If
Application.ScreenUpdating = True
End Sub