The_Fog 0 / 0 / 2 Регистрация: 24.02.2016 Сообщений: 75 |
||||||||||||
1 |
||||||||||||
30.01.2017, 12:58. Показов 27703. Ответов 18 Метки нет (Все метки)
Скрипт должен получить имя активного файла, создать его копию, и в копии имени заменить некоторые символы.
т.е. проблема со строчкой
Добавлено через 28 минут
Но пишет ошибку Run-time error ‘424’ Object required. =(
0 |
3217 / 966 / 223 Регистрация: 29.05.2010 Сообщений: 2,085 |
|
30.01.2017, 13:58 |
2 |
Replace(ActiveDocument.Name А причем здесь ActiveDocument?
0 |
The_Fog 0 / 0 / 2 Регистрация: 24.02.2016 Сообщений: 75 |
||||
30.01.2017, 14:15 [ТС] |
3 |
|||
Я так понял
с помощью этой функции можно получить имя файла. Если нет подскажите пожалуйста как получить это имя и заменить в нем пару символов.
0 |
toiai 3217 / 966 / 223 Регистрация: 29.05.2010 Сообщений: 2,085 |
||||
30.01.2017, 14:19 |
4 |
|||
ActiveDocument.Name Это Word документ…
0 |
The_Fog 0 / 0 / 2 Регистрация: 24.02.2016 Сообщений: 75 |
||||
30.01.2017, 14:37 [ТС] |
5 |
|||
Не не не, я тоже думал что так, но не так =( Тоже выдает ошибку =(
0 |
6875 / 2807 / 533 Регистрация: 19.10.2012 Сообщений: 8,562 |
|
30.01.2017, 14:40 |
6 |
ThisWorkbook — это не активная книга, а книга с кодом, не факт что они совпадают!
0 |
The_Fog 0 / 0 / 2 Регистрация: 24.02.2016 Сообщений: 75 |
||||
30.01.2017, 15:22 [ТС] |
7 |
|||
обе функции ошибку выдают
0 |
CyberHelp 6 / 6 / 1 Регистрация: 29.01.2017 Сообщений: 29 |
||||
30.01.2017, 15:27 |
8 |
|||
Этот макрос скопирует вам активный файл excel в ту же директорию, где находится активный файл, при этом активный файл (например «файл1») будет закрыт и будет открыто окно сохраненного файла (например «!55файл1»). Если вам необходимо, чтобы копия файла сохранялась отдельно, т.е. без закрытия оригинального файла, то немного другой код будет.
0 |
0 / 0 / 2 Регистрация: 24.02.2016 Сообщений: 75 |
|
30.01.2017, 16:53 [ТС] |
9 |
не получается ошибка…
0 |
6 / 6 / 1 Регистрация: 29.01.2017 Сообщений: 29 |
|
30.01.2017, 17:30 |
10 |
1) Скиньте скриншот. У меня всё отлично работает.
0 |
6 / 6 / 1 Регистрация: 29.01.2017 Сообщений: 29 |
|
30.01.2017, 17:37 |
11 |
Вот вложил файл. Зайдите и нажмите на кнопку.
1 |
pashulka 4131 / 2235 / 940 Регистрация: 01.12.2010 Сообщений: 4,624 |
||||
30.01.2017, 18:13 |
12 |
|||
The_Fog, Если проблема только в имени нового файла, то :
1 |
The_Fog 0 / 0 / 2 Регистрация: 24.02.2016 Сообщений: 75 |
||||||||
31.01.2017, 12:51 [ТС] |
13 |
|||||||
Этот макрос скопирует вам активный файл excel в ту же директорию, где находится активный файл, при этом активный файл (например «файл1») будет закрыт и будет открыто окно сохраненного файла (например «!55файл1»). Если вам необходимо, чтобы копия файла сохранялась отдельно, т.е. без закрытия оригинального файла, то немного другой код будет. Ваш код работает, а у меня почему то нет
0 |
Hugo121 6875 / 2807 / 533 Регистрация: 19.10.2012 Сообщений: 8,562 |
||||
31.01.2017, 12:52 |
14 |
|||
The_Fog, что напишет
0 |
6 / 6 / 1 Регистрация: 29.01.2017 Сообщений: 29 |
|
31.01.2017, 17:11 |
15 |
Попробуйте заменить & на + везде
0 |
6875 / 2807 / 533 Регистрация: 19.10.2012 Сообщений: 8,562 |
|
31.01.2017, 17:15 |
16 |
CyberHelp, вообще обычно рекомендуют делать наоборот
0 |
6 / 6 / 1 Регистрация: 29.01.2017 Сообщений: 29 |
|
31.01.2017, 17:24 |
17 |
Мой код тоже не работал пока я & не заменил на +
0 |
6875 / 2807 / 533 Регистрация: 19.10.2012 Сообщений: 8,562 |
|
31.01.2017, 17:26 |
18 |
Это интересно, не слышал о таком казусе. Это на какой системе такое?
0 |
The_Fog 0 / 0 / 2 Регистрация: 24.02.2016 Сообщений: 75 |
||||
01.02.2017, 17:12 [ТС] |
19 |
|||
Ошибка в моем коде была…
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
01.02.2017, 17:12 |
19 |
In this guide, we’re going to show you how to get filename from path in Excel. We will cover how to do this with and without VBA.
Download Workbook
File path and file name
A file path is a string identifier that specifies the unique location in a file system. It contains folders in a hierarchical order following by a file name. Each element is separated by a delimiter which is usually a backslash «». The goal of getting filename from path is to parse that filename after the last delimiter.
Warning: If your paths contain another separator, update the formulas by replacing backslash («») with the separator character fits your case.
We will show you four different approaches to get filename from path in Excel.
Conservative method
Our first approach is using well known Excel functions MIN, SUBSTITUE and LEN to get the file name. You can use this formula in any Excel version.
=MID(<path>,FIND(«*»,SUBSTITUTE(<path>,»»,»*»,LEN(<path>)-LEN(SUBSTITUTE(<path>,»»,»»))))+1,LEN(<path>))
This formula has couple of steps:
- At the inner section, all separators («») get replaced with empty strings.
- The formula subtracts the length of substituted path (1) from original path to find the number of separators.
- The outer SUBSTITUTE function replaces the last separator («») with «*». Obviously, the last separator’s instance is equal to number of separators (2).
- Finally, the FIND locates the «*» character, and the MID function parses the file name after the character.
VBA with FileSystemObject
You can use VBA to create your own custom functions which you can use in worksheet as well. Of course, you can use this function in your macros as well.
The code is very short. It uses GetFileName method of FileSystemObject object. The important section of the code is the initializing of the object. The following code sets FileSystemObject object to fso variable.
Set fso = CreateObject(«Scripting.FileSystemObject»)
Once the object is initialized, use the GetFileName method by providing the path.
GetFileNameFromPath_FSO = fso.GetFileName(«C:Excel FilesDashboards.xlsm»)
The above line returns «Dashboard.xlsm» string. Here is the function version you can use in your worksheets as well.
Function GetFileNameFromPath_FSO(ByVal Path As String) As String Set fso = CreateObject("Scripting.FileSystemObject") GetFileNameFromPath_FSO = fso.GetFileName(Path) End Function
VBA with a recursive function
A recursive function is function which calls itself. The recursive approach acts like an iteration and helps us to parse values starting from the end of a string. You could have used recursive functions only in VBA until the LAMBDA function has been released. Because the most of Excel users do not have access to the LAMBDA function, we will show you VBA version which any Excel user can use.
This function has only few rows as well. The function’s name is GetFilenameFromPath_Recursive and take a single argument named Path.
The first row is a logical test that checks if the last character in the argument is a backslash («») or not and if the argument is not an empty string. If the test is passed, the function returns itself with the argument without its last character and the last character of the path. This is where the recursion occurs.
The function runs itself until coming up a backslash («») or not a character left. It parses the characters from the right side and combines them with each run.
The last row contains a standard End If statement which determines where the If block ends.
Function GetFilenameFromPath_Recursive(ByVal Path As String) As String If Right$(Path, 1) <> "" And Len(Path) > 0 Then GetFilenameFromPath_Recursive = GetFilenameFromPath_Recursive(Left$(Path, Len(Path) - 1)) & Right$(Path, 1) End If End Function
Using LAMBDA to get filename from path
If you are Microsoft 365 subscriber, you can create recursive functions without using VBA. Briefly, the LAMBDA function is a special function that converts named ranges into user defined functions. Its syntax allows you to define arguments and a custom formula which uses that defined arguments.
For example, let’s say my custom function will have two arguments and returns multiplication of two arguments. All I need to is creating a named range, such as «MyLambda» and enter the following formula into Refers to box.
Syntax | Sample Formula | Sample Result |
=LAMBDA(x, y, x*y) | =MyLambda(2,3) | 6 |
If you call the named range «MyLambda» in the «MyLambda» function, you will create a recursive function. Same logic can be applied to VBA function at previous section.
The following is the LAMBDA version of our VBA code. The function’s name is GetFileNameFromPath_Lambda. Check out how the function calls itself after IF function’s logical test.
=LAMBDA(Path,IF(AND(RIGHT(Path,1)<>»»,LEN(Path)>0),GetFileNameFromPath_Lambda(LEFT(Path,LEN(Path)-1))&RIGHT(Path,1),»»))
Warning: Do not forget to update formula name in the formula if you change the named range’s name. Otherwise, the function returns #NAME? error due to incorrect function name.
Using LAMBDA Function with different approach
Alternatively, you can use the LAMBDA function without calling the «function name». The definition may sound complicated since you must call the function in the function by its name. This structure dictates you to update each occurrence of the name every time change the function’s name.
You can overcome this necessity by using another Microsoft 365-specific function called LET. The LET function allows you to define named ranges in a formula scope. You can define repeating values or blocks into these names and use them continuously.
If you define the name of the LAMBDA function in the formula, you can use the in-formula name over and over to make the function recursive. In our example, we create the name «Func» in the formula and call it within self. Outer LAMBDA function is to give the whatever name we want, «GetFileNameFromPath_LambdaMe».
=LAMBDA(Path,LET(Func,LAMBDA(ME,Path,IF(AND(RIGHT(Path,1)<>»»,LEN(Path)>0),ME(ME,LEFT(Path,LEN(Path)-1))&RIGHT(Path,1),»»)),Func(Func,Path)))
Irbis_evs
Пользователь
Сообщений: 337
Регистрация: 30.03.2017
частично, забыл уточнить, что код открывает другой файл, необходимо вернуться обратно.
начало кода:
Код |
---|
Dim sh 'As Worksheet, i&, lRow Dim lSpisok, itable, dSpisok, prod, dd book = ThisWorkbook.Name ' Настройка списка фильтров Filt = ("XLS Files(*.xl*),*.xl*") 'Получение имени файла FileName1 = Application.GetOpenFilename(FileFilter:=Filt) ' При отмене выйти иэ окна If FileName1 = False Then MsgBox "Файл не выбран." End If Set objCloseBook = GetObject(FileName1) 'objCloseBook.Close False Windows("123.xlsm").Activate Worksheets("Список").Select ActiveSheet.Unprotect ' Отображение полного имени и пути 'MsgBox OpenWorkbook(GetObject(FileName1).Name) |
Инженер не тот, кто все знает, а тот кто знает где найти ответ.
Доброго дня!
Обычно делаю так:
Перед открытием файла, запоминаю параметры исходного:
WBOld = Thisworkbook.Name
WSOld = ActiveSheet.Name
Теперь открываю нужный файл. Естественно, что он после открытия становится активным.
Ну а дальше варианты:
Если мне нужно из этого активного файла переписать данные в файл открывающий (например значение в ячейке E2, вызываемого файла, активный лист), то записываю данные в переменную (-нные) и затем:
param=0
param=cells(2,5).Value
With workbooks(WBOld).Worksheets(WSOld)
.cells(3,2)=param
param=0
End With
В случае, если же мне нужно перейти в вызывающую книгу и вызывающий лист, то так
workbooks(WBOld).activate
Worksheets(WSOld).select
Вот кусок кода:
'собираем перечень использованных в эти даты объектов = Start ===
'запоминаем исходные книгу и лист
wobk = ThisWorkbook.Name
wost = "DayWork"
'Открываем Tbl&CC.xls
''Проверяем не открыта ли она уже,
fil01 = False
For Each wbk In Workbooks
If wbk.Name = "Tbl&CC.xls" Then
fil01 = True
Exit For
End If
Next
'если не открыта, то открываем
If fil01 = False Then
Application.ScreenUpdating = False '- отключаем обновление экрана
Application.EnableEvents = False '- отключаем реакцию на события
Workbooks.Open Filename:="\EnergypoleTbl&CC.xls", ReadOnly:=True, Password:="Wolf" '- только на чтение
Application.EnableEvents = True '- включаем реакцию на события
End If
With Workbooks("Tbl&CC.xls").Worksheets("CCS")
'определяем занятую данными область листа == Start ==
Set blok = .UsedRange
nREnd = blok.Row + blok.Rows.Count - 2
Set blok = Nothing
'определяем занятую данными область листа == Stop ==
If nREnd < 3 Then
MsgBox "База Табеля [Tbl&CC.xls] - ПУСТА!", vbQuestion + vbOKOnly, ""
closeTabel fil01
Exit Sub
End If
'формируем массив объектов
k = 0
ReDim arrNabor(k)
datT = 0
i = 0
For i = nREnd To 4 Step -1
datT = .Cells(i, 6).Value
flgT = False
'Stop
j = 0
For j = LBound(arrVibor) To UBound(arrVibor)
If datT = CDate(arrVibor(j)) Then
flgT = True
End If
Next j
If flgT = True Then
'
datR = .Cells(i, 2).Text
flgQ = False
f = 0
For f = LBound(arrNabor) To UBound(arrNabor)
If datR = arrNabor(f) Then
flgQ = True
End If
Next f
If flgQ = False Then
If k > 0 Then
ReDim Preserve arrNabor(k)
End If
arrNabor(k) = datR
k = k + 1
End If
End If
'
datT = 0
datR = ""
Next i
End With
Erase arrVibor
closeTabel fil01
Workbooks(wobk).Worksheets(wost).Activate
'собираем перечень использованных в эти даты объектов = Stop ===
если непонятно — спрашивайте …
Формулировка задачи:
Здравствуйте!
Задача следующая: в Книге excel есть ячейка, в которой данные постоянно меняются в зависимости от запроса. Необходимо создавать каждый раз новый файл excel с отчетом (не важно каким), где в имени файла будет значение этой исходной ячейки. Долго бьюсь над этой проблемой, так и не смог решить
уточнение: в одной из ячеек в новой книге также будет значение этой ячейки. т.е. задача сводится к тому, чтобы сохранить новый файл с именем равным значению ячейки в новой книге. короче, как сохранить книгу с именем, которое равно значению ячейки в ней же.
надеюсь, не запутал
Код к задаче: «Создать имя файла, соответствующее ячейке»
textual
Sub Макрос1() 'Есть ещё SaveCopyAs. 'Вместо .xls можно использовать др. расширения Excel (например, xlsx). ActiveWorkbook.SaveAs _ Filename:="C:Documents and SettingsПользовательРабочий стол" & _ ActiveWorkbook.Worksheets(1).Cells(1, 1).Text & ".xls" End Sub
Полезно ли:
14 голосов , оценка 4.286 из 5