Sanja написал: если сохранить его под другим именем/путем, то продолжать работу Вы уже будете в этом пересохраненном файле
А первоначальный файл, который Вы изначально открыли, не будет изменяться при дальнейшей работе. Видимо Вам нужна синхронизация файлов, но это уже вопрос не к Excel
Так не работает. Копировать открытый файл нельзя, если сохранить его под другим именем/путем, то продолжать работу Вы уже будете в этом пересохраненном файле. Без закрытия и повторного открытия никак. Это, в принципе, тоже можно делать макросом. Ну или копировать этот файл уже в конце рабочего дня. Или Вы вообще никогда их не закрываете?
Ну тогда повторюсь - FileCopy Вам не подходит, смотрите в сторону Метод Workbook.SaveAs (Excel) Но!!! после сохранения в другом месте Вы уже будете работать с копией изначального файла, сохраненного по новому пути
Получится, но я в этом не участвую) бррр... Добавил строку закрытия книги после проверки и сохранения
Скрытый текст
Код
Sub Copy_File22()
Dim Книга As Workbook 'Сохранить измененные файлы
Dim sFileName As String, sNewFileName As String 'Копировать файлы
' Проходим через каждую рабочую книгу в коллекции Workbooks
For Each Книга In Workbooks
' Проверяем, имеет ли книга путь сохранения
If Книга.Path <> "" Then
' Проверяем, была ли книга изменена
' с момента последнего сохранения
If Not Книга.Saved Then
' Если книга была изменена, сохраняем ее
Книга.Save
End If
'Закрываем книгу
Книга.Close False
End If
Next Книга
sFileName = "C:\Users\***\Downloads\Книга1.xls" 'имя файла для копирования
sNewFileName = "C:\Users\***\Downloads\!ПОИСК\Книга1.xls" 'имя копируемого файла.
If Dir(sFileName, 16) = "" Then MsgBox "Нет такого файла", vbCritical, "Ошибка": Exit Sub
FileCopy sFileName, sNewFileName 'копируем файл
sFileName = "C:\Users\***\Downloads\Книга2.xls" 'имя файла для копирования
sNewFileName = "C:\Users\***\Downloads\!ПОИСК\Книга2.xls" 'имя копируемого файла.
If Dir(sFileName, 16) = "" Then MsgBox "Нет такого файла", vbCritical, "Ошибка": Exit Sub
FileCopy sFileName, sNewFileName 'копируем файл
'и далее по списку)
End Sub
Согласие есть продукт при полном непротивлении сторон
RUSBelorus написал: по факту много и у каждого свой путь
Тогда лучше сразу иметь список соответствий названий файлов с их путями. Вы же не будете под каждый файл макрос редактировать? Список можно разместить на отдельном листе того же файла, из которого запускаете макрос
Согласие есть продукт при полном непротивлении сторон
koniashka26 написал: а как данный код применить к такой же таблице
Ну так у Hugo, функция на основе этого же макроса)
Цитата
koniashka26 написал: Скорее всего, макрос надо переписывать для большого кол-ва данных
Макрос написан для ЛЮБОГО количества данных. Если структура файла-примера и реального файла одинаковы (т.е. исходные данные на 'Лист1', данные начинаются с 5й строки 1го столбца, после последней строки с данными нет других значений типа подписи/фамилии и т.п., существует 'Лист2', ну и т.д...) то макросу без разницы объем Ваших данных. Для работы функции от Hugo, нужно так же перенести ее код в основной модуль и использовать на листе как штатную формулу. В качестве аргумента функции выделите ВЕСЬ диапазон с исходными данными)
Согласие есть продукт при полном непротивлении сторон
Sub GetComboList()
Dim lRow&, I&
Dim arr()
Dim iTmp
With Sheets("Список_НД")
lRow = .Cells(.Rows.Count, 5).End(xlUp).Row
'забираем в массив значения из 5го и 6го столбцов
'если хотите 'Да' записывать в столбце 'H', то нужно расширить диапазон до 8го столбца
'arr = .Range(.Cells(4, 5), .Cells(lRow, 8)).Value
'если в каком-то другом столбце, то соответственно до номера этого столбца
arr = .Range(.Cells(4, 5), .Cells(lRow, 6)).Value '
End With
With CreateObject("Scripting.Dictionary")
For I = LBound(arr, 1) To UBound(arr, 1)
'тогда и в массиве нужно указывать не 2й 'столбец', а 4й
'If arr(I, 4) = "Да" Then
'ну и так далее
If arr(I, 2) = "Да" Then
iTmp = .Item(arr(I, 1))
End If
Next
arrList = Application.Transpose(.Keys)
End With
End Sub
Sub TableFrom1C()
Dim arr(), newArr()
Dim I&, J&, N&, K&
On Error Resume Next
Application.ScreenUpdating = False
With Worksheets("Лист1")
arr = .Range("A2:G" & .Cells(.Rows.Count, "C").End(xlUp).Row).Value
End With
ReDim newArr(LBound(arr, 1) To UBound(arr, 1), 1 To 7)
For I = LBound(arr, 1) To UBound(arr, 1)
If arr(I, 1) <> "" Then
N = N + 1
newArr(N, 1) = arr(I, 1)
newArr(N, 2) = arr(I, 2)
newArr(N, 3) = arr(I, 4)
newArr(N, 4) = arr(I, 5)
newArr(N, 5) = arr(I, 6)
newArr(N, 6) = arr(I, 7)
newArr(N, 7) = arr(I, 3)
K = 7
Else
K = K + 1
If K > UBound(newArr, 2) Then
ReDim Preserve newArr(LBound(newArr, 1) To UBound(newArr, 1), LBound(newArr, 2) To K)
End If
newArr(N, K) = arr(I, 3)
End If
Next
With Worksheets("Лист2")
.Range("A2").CurrentRegion.ClearContents
.Range("A1").Resize(N, UBound(newArr, 2)) = newArr
.Activate
End With
Application.ScreenUpdating = True
End Sub
Посмотрите файл. Наполнение Списка и обработку Поиска вынес в отдельные процедуры, что бы не прописывать их для каждого ComboBox'а Если количество ComboBox'ов превысит какие-то разумные пределы, возможно, стоит присмотреться к Классам Работа с модулями классов
Согласие есть продукт при полном непротивлении сторон
4.1. Создавать одинаковые темы или сообщения в разных форумах (cross-posting). Публикуя один и тот же вопрос в разных форумах и на дружественных сайтах вы заставляете сразу нескольких людей параллельно думать над вашей задачей и обесцениваете усилия тех, кто даст ответ вторым-третьим и т.д.
Ну а по теме - зачем лишний раз клацать, так никаких мышей не напасёшься) VBA предоставляет достаточно инструментов для определения границ нужного диапазона Как определить последнюю ячейку на листе через VBA? CurrentRegion, UsedRange и т.п. Используйте Умные таблицы Вы лучше опишите ЗАДАЧУ, а не СПОСОБ, которым пытаетесь ее решить
Не открывается гиперссылка на лист внутри одной книги, Не открывается гиперссылка на лист внутри одной книги - это действие запрещено политикой организации, обратитесь в службу поддержки
Hugo написал: там тоже выкидывать ненужные элементы
Можно словарь объявить на уровне модуля формы, при инициализации формы наполнять его значениями зависящими от 'Да' и потом использовать во всех процедурах обработки нужных событий
Согласие есть продукт при полном непротивлении сторон
Я не бухгалтер, но мне кажется, что при поквартальном подходе цена одно календарного дня будет разнится от квартала к кварталу, т.к. количество дней в них различно. Если считать по годовой цене одного дня будет как-то честнее) Это моё дилетантское мнение
Согласие есть продукт при полном непротивлении сторон