Файл в приложении. Весь макрос по операциям с ячейками очень длинный, наверное выкладывать его целиком не стоит. Смысл работы макроса в том, чтобы открывать в заданной папке файлы по одному и сравнивать данные прописанного макросом диапазона в них с моим приложенным файлом.
Например, у меня в папке лежат 4 файла: id153 Москва, id194 Казань, id168 Новгород и id155 Уфа. Макрос открыл первым файл id153 Москва и сравнивает каждую ячейку из заданного в нём диапазона с каждой ячейкой приложенного файла. И требуется, чтобы он сравнивал не с каждой ячейкой от начала до конца таблицы приложенного файла, а только с ячейками, у которых в колонке 7 написано id153. И так для остальных файлов из папки.
Не знаю как обойтись без выделения, потому что сравниваются два диапазона и счёт ячеек идёт по тому файлу, который открывает макрос, а требуемый мне сейчас диапазон получается в этом случае как бы пассивным.
Такая проблема: имеется таблица, в которой по определенному кодовому слову в колонке нужно выделить диапазон ячеек для дальнейших действий с этим выделением. Ячейки с этим кодовым словом обычно идут по порядку в общей таблице, но могут и "убежать" в другую её часть. Поэтому по возможности хотел предусмотреть и вариант с несвязным диапазоном. Я пока нашёл только способ выделять связный диапазон от первого найденного слова до конца таблицы, но это не то, что нужно
Помогите разобраться пожалуйста. При выполнении приложенного макроса (или похожих на него, использующих поочередное открытие файлов) после открытия последнего файла в папке появляется окно "Свойства канала передачи данных", требующего указать какой-то источник данных. При рандомном указании источника и нажатии на ОК окно закрывается и макрос прерывается. Просто мне непонятно, откуда окно и что там указывать. Макрос делает следующую операцию - сверяет в каждом файле указанной юзером папки в указанной пользователем вкладке данные с исходным файлом. ОШибка может как возникать, так и не возникать, если для проверки выбирать разные папки. Кто-нибудь с таким сталкивался? С чем связа
Код
Sub CHECK_DATA()
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Dim katal As Variant
Dim CompareRange As Variant, x As Variant, y As Variant
Dim n As Long
'Dim Ofrange As Long
Dim input_sheet As String
input_sheet = InputBox("введите период(название листа) для проверки")
katal = GetFolderPath("Укажите каталог с файлами", ThisWorkbook.Path)
If katal <> "" Then
Dim FS, KATALOG, FILE, MASSIV As Object
Set FS = CreateObject("Scripting.FileSystemObject")
Set KATALOG = FS.GetFolder(katal)
Set MASSIV = KATALOG.Files
Range("B12").Select
n = Empty
Do While Range("B12").Offset(1 + n) <> Empty
Range("B12").Offset(1 + n, 18).Value = Range("B12").Offset(1 + n).Value & " " & Range("B12").Offset(1 + n, 3).Value
n = n + 1
Loop
Range("B12").Select
Set Rng = Range(Selection, Selection.End(xlDown)).Offset(0, 18) ' выбираем в сводном файле диапазон КР+запчасть для сверки
' If Rng.Cells.Count > 20000 Then Exit Sub
For Each FILE In MASSIV 'пробегаемся по каждому файлу из папки
Workbooks.Open Filename:=FILE
On Error Resume Next
If ActiveWorkbook.Name <> "файл1.xlsm" Then
If Sheets(input_sheet) Is Nothing Then
GoTo lastline
Else
Sheets(input_sheet).Activate
Range("A1:C2000").Find("Код ЗЧ", LookIn:=xlValues).Select 'цикл поиска таблицы РТВ по привязке к коду ЗЧ
If Selection Is Nothing Then
GoTo lastline
Else
Set CompareRange = Range(Selection, Selection.End(xlDown))
For Each x In Rng
For Each y In CompareRange
y.Offset(0, 9).Value = y.Value & " " & y.Offset(0, 3).Value
If x.Value = y.Offset(0, 9).Value Then x.Offset(0, -18).Interior.Color = y.Interior.Color
Next y
Next x
End If
End If
End If
lastline:
ActiveWorkbook.Close (False)
Next FILE
MsgBox "Готово"
Columns("T:T").Delete
Else
MsgBox "Каталог не выбран"
End If
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub
Function GetFolderPath(Optional ByVal Title As String = "Выберите папку", _
Optional ByVal InitialPath As String = "c:\", _
Optional ByVal FilterDescription As String = "Файлы Excel", _
Optional ByVal FilterExtention As String = "*.xlsm*") As String
Dim PS As String: PS = Application.PathSeparator
With Application.FileDialog(msoFileDialogFolderPicker)
If Not Right$(InitialPath, 1) = PS Then InitialPath = InitialPath & PS
.ButtonName = "Выбрать": .Title = Title: .InitialFileName = InitialPath
If .Show <> -1 Then Exit Function
GetFolderPath = .SelectedItems(1)
If Not Right$(GetFolderPath, 1) = PS Then GetFolderPath = GetFolderPath & PS
End With
End Function
Только начал изучать эту полезную функцию Split по ссылке, смотрю - а уже и код появился. Спасибо, работает именно так как я хотел! Ставлю огромный лайк.
Подскажите направление мысли, как реализовать задачу: Есть таблица заказа с множеством строк, в определенной ячейке X некоторых из них записано N артикулов деталей через разделитель: A1,A2,A3 (но может быть и просто A1, либо совсем пустое поле). Необходимо таблицу преобразовать таким образом, чтобы одна строка с N перечисленных артикулов расщепилась на N строк с одним артикулом в каждой. При этом остальные данные со строки должны быть просто скопированы. Пример в приложении.
Если у кого-то вдруг есть наброски макросов на эту тему, буду еще больше благодарен. Не знаю даже как подступиться.
Вопрос закрыт. Ошибка при копировании решается подстановкой этой же строчки в макрос файла, В КОТОРЫЙ копируется ячейка. А не файла, из которого она копируется
Добрый день, столкнулся с проблемой - при вставлении скопированной ячейки, содержащей гиперссылку, из одной книги в другую, адрес искажается. Например, в файле1 в ячейке есть гиперссылка \\Srv-s01\file1.xls Если эту ячейку скопировать макросом и вставить с помощью xlPasteAll в любую другую книгу(файл2) из этой же папки, то клик по вставленной в файл2 ячейке откроет указанное место в файле1. Но если файл2 находится хотя бы в подпапке \\Srv-s01\Public\file1.xls , то вставленная в файл2 гиперессылка всё равно содержит адрес \\Srv-s01\file1.xls , то есть всегда директорию запускаемого файла2 и не открывается.
Есть какое-то решение у этой проблемы? Кстати, даже если копировать ячейку вручную, гиперссылка в файле2 всё равно не открывается по той же причине.
Уже намного лучше! Правда теперь еще одна проблема всплыла, при копировании этой ячейки и вставке методом xlPasteAll ссылка вставляется неправильно, указывая путь к нужному файлу в ту папку, откуда я запускаю сводный файл. Хотя внутри файла с контрольной ячейкой адрес гиперссылки прописан верно. Получается, что ссылка работает только в случае если оба файла находятся в одной папке. Скрипт, которым я копирую контрольную ячейку, ниже. Может получится каким-то образом разобраться...
Код
Sub проверка_возврата()
Application.ScreenUpdating = False
Dim WB1 As Workbook, Wb2 As Workbook
Dim x As Integer
Dim wk16 As Worksheet
On Error Resume Next
Set Wb2 = Workbooks("\\Srv-f01\svodnyi.xlsm") ' таблица, в которую копируются контрольные ячейки
Set WB1 = Application.Workbooks.Open("\\Srv-f01\Public\file1.xlsm") ' файл с контрольной ячейкой
x = 2
For Each wk16 In WB1.Worksheets
wk16.Cells(500, 87).Copy
With Wb2.Sheets(1).Cells(9, x)
.PasteSpecial Paste:=xlPasteAll
End With
x = x + 1
Next wk16
WB1.Close (False)
Application.ScreenUpdating = True
End Sub
Цитата
Казанский написал: Вам придется из каждого листа копировать по одной ячейке. Может лучше макросом создать новый лист, в первом столбце которого создать такие гиперссылки на каждый лист? Скопировать все гиперссылки за один раз, потом лист удалить.
Хорошая идея, спасибо. Наверное так и сделаю, если получится что-то сделать с гиперссылками.
Казанский, ура, работает! А можно ли в этом же макросе путь к файлу прописать, чтобы он открывался извне, но тоже сразу на нужном листе и ячейке A1? Ну например из "C:\Users\file.xls" Хочу из кучи однотипных файлов копировать эти контрольные ячейки и вставлять в сводную таблицу (макрос уже написал), чтобы при клике на ссылку в этой сводной таблице открывался мой файл1 на листе, откуда скопирована эта контрольная ячейка.
Есть макрос, пробегающий по все вкладкам файла и записывающий в контрольную ячейку (87,500) название листа и заданный ColorIndex.
Код
For Each wsSh In ThisWorkbook.Worksheets 'пробегаемся по вкладкам
With wsSh
.Tab.ColorIndex = 4 ' красим ярлыки листов в зеленый
With .Range("CI500")
.Interior.ColorIndex = 4 ' красим зеленкой ячейку CI500
.Value = wsSh.Name
End With
End With
Next
Как сделать, чтобы в .Value записывалась еще и гиперссылка на ячейку A1 этого же пробегаемого листа? Спасибо
Извиняюсь, но вопрос вроде бы по теме. В моей версии макроса для файла1 значения ниже таблицы не обрабатывались. Как и задумано. Но при вызове из файла2 давали сбой.
Макрос Sanja намного быстрее не содержит ошибок, но для моего случая получается непригодным, потому что каким-то образом обрабатывает ячейки и ниже заданного диапазона. Вот и прошу помочь.
Спасибо большое! Похоже и правда проблема была в этом. Сам писать я не умею, в основном правлю макрорекордер, поэтому сплошь Activate и Select. Буду учиться.
А можно ли подредактировать код так, чтобы он не искал значения ниже своей основной таблицы Кода ЗЧ (файл1) ? Например, в вашей версии макроса для файла1, если под анализируемой таблицей с Код ЗЧ в файле1 через пару пустых строк кто-то разместил еще и сводную (такое бывает), то даже в случае отсутствия незакрашенных ячеек основной таблицы вкладка и контрольная ячейка станут красными. Как будто нашлась незакрашенная ячейка в диапазоне. А по моему замыслу должна быть зелёной.
Добрый день, Есть файл с настроенным макросом (файл1), автоматически запускаемом при закрытии этого файла. Этот макрос проверяет незакрашенные ячейки в диапазоне, заданном относительно кодового слова "Код ЗЧ" и закрашивает ячейку (87,500) в зависимости от результата проверки диапазона. При каждом закрытии файла макрос выполняется ОК, никаких ошибок нет.
Есть файл2, который вызывает первый файл и копирует из каждой вкладки значение ячейки (87,500).
Экспериментально выяснено, что если В ПОСЛЕДНЕЙ вкладке файла1 всего одно значение для проверки, то выполнение макроса в файле2 приводит к зависанию макроса файла1. При добавления в диапазон последней вкладки файла1 второго значения ошибка пропадает и макрос файла2 выполняется до конца.
Вкладок в файле1 может быть сколько угодно, ошибается всегда на последней. Для быстроты оставил только две вкладки.