Юрий М написал: Для проверки напишите Stop в процедуре - тогда точно будете знать, срабатывает или нет.
Цитата
The_Prist написал: Может ошиблись с именем книги и условие просто не выполняется.
Еще раз перепроверил, поставил stop, перезапустил, выяснил что имя неверно (пробел лишний). Все работает! Спасибо! Только группировки не раскрываются) ActiveSheet.Outline.ShowLevels RowLevels:=3
Перезапускал. Что-то не могу понять, сейчас все работает. Может быть связано с тем, что на работе office 2010, a дома 2016. в 2010 все книги по умолчанию в одном окне открываются (приложении), соответственно и события нового _Open не возникает при открытии следующей книги, правильно? подправил.
Код
Private WithEvents App As Application
Private Sub Workbook_Open()
Set App = Application
End Sub
Private Sub App_WorkbookOpen(ByVal Wb As Workbook)
' Если открыт телефонный справочник, открыть страницу КЭ, развернуть группировку
If Wb.Name = "Тел - справ.xls" Then
Wb.Sheets("КЭ").Select
'ActiveSheet.Outline.ShowLevels RowLevels:=3
End If
End Sub
Видимо я что-то сделал не так, при открытом приложении excel, (открыты другие книги) событие не происходит. Код расположен в главной книге personal
Код
Private WithEvents App As Application
Private Sub Workbook_Open()
Set App = Application
End Sub
Private Sub App_WorkbookOpen(ByVal Wb As Workbook)
' Если открыт телефонный справочник, открыть страницу КЭ, развернуть группировку
If Wb.Name = "Тел - справ.xls" Then
Sheets("КЭ").Select
ActiveSheet.Outline.ShowLevels RowLevels:=3
End If
End Sub
Уважаемые форумчане! Подскажите пожалуйста! Есть книга (телефонный справочник), лежит на общем ресурсе, прав на изменения её у пользователей нет. Каждый раз при открытии книги я открываю определенную страницу, раскрываю группировку, и ctrl +f открываю окно поиска. Хотел автоматизировать, но не получается. Событие при открытии книги (сохраненное в общей книге макросов!) не срабатывает. Вопрос - как увидеть открытие книги из уже открытого приложения excel
Код
?Private Sub Workbook_Open()
' Если открыт телефонный справочник, открыть страницу КЭ, развернуть группировку
If ActiveWorkbook.Name = Тел - справ.xls Then
Sheets("КЭ").Select
ActiveSheet.Outline.ShowLevels RowLevels:=3
End If
End Sub
Михаил С., мне не нужны сразу больше 100 строк, но как вариант-сначала узнать количество подходящих под критерий записей и добавить разом все строки. Наверно работать будет быстрее). Спасибо!
iRow_Sd = 6 'по всем записям в реестре
For iRow_Rr = 6 To 500
'по выбранному табельному
If wsh_Реестр.Cells(iRow_Rr, 1) Like Табельный Then
'добавить строку
.Rows(iRow_Sd).Copy
.Rows(iRow_Sd).Insert Shift:=xlDown
Application.CutCopyMode = False ' ОЧИСТИТЬ БУФЕР ОБМЕНА
DoEvents
Application.StatusBar = "Добавлена строка из реестра: " & iRow_Sd
For iColumn = 1 To 100
If wsh_Реестр.Cells(1, iColumn) <> "" Then
.Cells(iRow_Sd, Столбец(wsh_Реестр.Cells(1, iColumn), wsh_Свод.Name)) = _
wsh_Реестр.Cells(iRow_Rr, iColumn)
End If
Next
iRow_Sd = iRow_Sd + 1
End If
Next
Цикл по реестру с данными определяет наша это запись или нет "like Табельный" если наши - тогда нам нужна строка на листе "свод" с формулами и форматированием (всиавляю скопированную), в котрорую раскладываю даннные из этой записи.( Влженный цикл по столбцам). Кажется понял что, хотел сказатьvikttur, -мне нужно эту строку один раз скопировать в буфер, так?
Я заранее не знаю, сколько строк нужно будет вставить, 5 или больше 100. поэтому, по одной. Сразу после вставки я редактирую эту строку и после этого. снова встаить строку из буфера, не получается. видимо её там (в буфере) уже нет)). Заранее подготовить избыточный диапазон с формулами, тоже вариант, но и как тогда его очищать, не сбивая формулы?
Dima S, Попробую завтра с утра что-нибудь придумать, чтоб выложить файл и не нарушить ни чьи права .
строка
Код
iRow_Sd = iRow_Sd + 1
грубо говоря в цикле не участвует. она определяет строку на листе "Свод" - это просто следующая строка для вставки соответствующих критерию данных. А цикл
Код
For iRow_Rr = 6 To 500
- по строкам другого листа - типа реестра, на котором и проверяется соответствие критерию If wsh_Реестр.Cells(iRow_Rr, 1) Like Табельный Then И вот просто добавление новой строки (скопированной, с формулами и усл форматированием) постепенно после 30 строки замедляется, это я вижу из статусбара
Не помогло. Вот весь блок, но думаю, что проблема всетаки из-за копирования.
Код
'очищаем лист свод
Call ОчиститьСвод
iRow_Sd = 6
'по всем записям в реестре
For iRow_Rr = 6 To 500
'по выбранному табельному
If wsh_Реестр.Cells(iRow_Rr, 1) Like Табельный Then
'добавить строку
.Rows(iRow_Sd).Copy
.Rows(iRow_Sd).Insert Shift:=xlDown
Application.CutCopyMode = False ' ОЧИСТИТЬ БУФЕР ОБМЕНА
DoEvents
Application.StatusBar = "Добавлена строка из реестра: " & iRow_Sd
For iColumn = 1 To 100
If wsh_Реестр.Cells(1, iColumn) <> "" Then
.Cells(iRow_Sd, Столбец(wsh_Реестр.Cells(1, iColumn), wsh_Свод.Name)) = _
wsh_Реестр.Cells(iRow_Rr, iColumn)
End If
Next
iRow_Sd = iRow_Sd + 1
End If
Next
Здравствуйте, уважаемые форумчаене! Подскажите пожалуйста, как можно устранить проблему: после копирования - всавки больше 30 строк, код выполняется значительно медленнее и чем дальше тем медленнее. Копирую шаблонную строку с формулами и форматированием. Обновление экрана и пересчет формул отключены.
Здравствуйте, помогите пожалуйста собрать формулу, для подсчета количества кусочков строки разделенной ";" В прошлый раз для распила строки vikttur предложил =СЖПРОБЕЛЫ(ПСТР(ПОДСТАВИТЬ("-"&$A1;"-";ПОВТОР(" ";50));50*(СТОЛБЕЦ(A1)-1)+50;50)) ' пробовал на основе её сделать массив, вложив в СЧЕТЗ, {=СЧЁТЗ(СЖПРОБЕЛЫ(ПСТР(ПОДСТАВИТЬ(";"&A$2;";";ПОВТОР(" ";300));300*(СТРОКА(A2)-СТРОКА($A$2))+300;300)))} получаетс всегда 1. В файле пример, как сейчас решаю, каждую ячейку одельно, а у меня болше сотни таких )))
Юрий М написал: Файл не смотрел. А Вы посмотрите в сторону Split
А вот и функция получилась
Код
Public Function ЧастьКода(Строка As String, Разделитель As String, Часть As Integer)
Dim Массив() As String
Массив = Split(Строка, Разделитель)
ЧастьКода = Массив(Часть - 1)
End Function
vikttur написал: Формулой по столбцам: =СЖПРОБЕЛЫ(ПСТР(ПОДСТАВИТЬ("-"&$A1;"-";ПОВТОР(" ";50));50*(СТОЛБЕЦ(A1)-1)+50;50)) Если по строкам - заменить СТОЛБЕЦ(A1) на СТРОКА(A1)
Хитрая формула )) если по строкам, кроме выше сказанного, еще $A1 заменить на A$1. Как вы их выдумываете? vikttur, Спасибо огромное!
Кажется справился, добавил цикл для поиска файла по маске, и получил полное имя файла.
Код
Public Sub Получить6()
Dim Адрес6 As String
Dim i As String
Dim Прграмма As Workbook
Dim Прил6 As Workbook
Dim ИмяФайла As String
On Error GoTo lable_1
Application.ScreenUpdating = False ' Отключаем “мерцание” окна
Set Прграмма = ThisWorkbook
Адрес6 = Прграмма.Worksheets("Const").Cells(1, 2) 'здесь должна быть маска K:\Отчеты 1,2,3,4 кв\*.xls*
'Workbooks.Open Filename:=Адрес6, UpdateLinks:=0, Notify:=False
ИмяФайла = Dir(Адрес6)
Do While ИмяФайла <> ""
If ИмяФайла Like "*xls*" Then
Адрес6 = Адрес6 & ИмяФайла
Exit Do
End If
ИмяФайла = Dir
Loop
Workbooks.Open Filename:=Адрес6, ReadOnly:=True, UpdateLinks:=0
Set Прил6 = ActiveWorkbook
Прил6.Sheets("филиал 1").Copy After:=Прграмма.Worksheets(Прграмма.Worksheets.Count)
Прграмма.Sheets("Ожидаемые").Activate
Прил6.Close (False)
Application.ScreenUpdating = True ' Возвращаем режим обновления экрана при изменении
Exit Sub
MsgBox "Нет связи с базой данных," & Chr(13) _
& "возможно файл перемещен," & Chr(13) _
& "обратитесь к Андрею ))!!!", vbOKOnly + vbCritical
End Sub
Здравствуйте, для получения данных (лист отчета целиком) из другой книги собрал код, но он не работает не хочет рботать с открытой книгой. Общий доступ делать нельзя. Может нужно указать, что открыть только для чтения? 'Open Workbooks(Адрес6) For Input As #1 Но ошибка "subscript out of range"
Function IsBookOpen(wbFullName As String) As Boolean
Dim iFF As Integer
iFF = FreeFile
On Error Resume Next
Open wbFullName For Random Access Read Write Lock Read Write As #iFF
Close #iFF
IsBookOpen = Err
End Function
Код
Public Sub Получить6()
Dim Адрес6 As String
Dim Прграмма As Workbook
Dim Прил6 As Workbook
'On Error GoTo lable_1
Application.ScreenUpdating = False ' Отключаем “мерцание” окна
Set Прграмма = ThisWorkbook
Адрес6 = K:\Отчеты 1,2,3,4 кв\*.xls*"
If IsBookOpen(Адрес6) Then
Set Прил6 = Workbooks(Адрес6)
'Open Workbooks(Адрес6) For Input As #1
Else: Set Прил6 = Workbooks.Open(Адрес6)
End If
Application.DisplayAlerts = False
Прил6.Sheets("филиал 1").Copy After:=Прграмма.Worksheets(Прграмма.Worksheets.Count)
Application.DisplayAlerts = True
Прграмма.Sheets("Ожидаемые").Activate
Прил6.Close (False)
Application.ScreenUpdating = True ' Возвращаем режим обновления экрана при изменении
Exit Sub
MsgBox "Нет связи с базой данных," & Chr(13) _
& "возможно файл перемещен," & Chr(13) _
& "обратитесь к Андрею ))!!!", vbOKOnly + vbCritical
End Sub
Пока писал, додумался до макререкордера вот что получилось:
Код
Public Sub Получить6()
Dim Адрес6 As String
Dim Прграмма As Workbook
Dim Прил6 As Workbook
'On Error GoTo lable_1
Application.ScreenUpdating = False ' Отключаем “мерцание” окна
Set Прграмма = ThisWorkbook
Адрес6 = Прграмма.Worksheets("Const").Cells(1, 2) 'здесь должна быть маска K:\Отчеты 1,2,3,4 кв\*.xls*
Workbooks.Open Filename:=Адрес6, UpdateLinks:=0, Notify:=False
Set Прил6 = ActiveWorkbook
Прил6.Sheets("филиал 1").Copy After:=Прграмма.Worksheets(Прграмма.Worksheets.Count)
Прграмма.Sheets("Ожидаемые").Activate
Прил6.Close (False)
Application.ScreenUpdating = True ' Возвращаем режим обновления экрана при изменении
Exit Sub
MsgBox "Нет связи с базой данных," & Chr(13) _
& "возможно файл перемещен," & Chr(13) _
& "обратитесь к Андрею ))!!!", vbOKOnly + vbCritical
End Sub
Но и здесь проблема, если указать полный адрес, тогда все работае (только задает вопрос, типа Здесь уже работают, продолжить?), а если маску (файлы время от времени меняют, известно что в этой папке он один), то предупреждает что "файл открыт, попробуйте позже" и дальше ошибка на строчке Workbooks.Open Filename:=Адрес6, UpdateLinks:=0, Notify:=False
И как её открыть . если адрес указан маской? (для чтения и без вопросов [продолжить?])
Здравствуйте! Есть строка 12-41-102-2-55, нужно её на части (без "-") в отдельные ячейки, для дальнейшей работы со справочниками. В принципе решение есть и формулой (во вложении) и макросом, но как-то аккуратнее хочется, но как?
Код
Sub РасшифороватьКод()
Dim Лесхоз As String
Dim Лесничство As String
Dim Квартал As String
Dim Выдел As String
Dim Делянка As String
Dim ДлиннаСтроки As Integer
Dim Код As String
Код = "12-41-102-2-55" 'может содержать строковые, маска "*-*-*-*-*"
ДлиннаСтроки = Len(Код)
Лесхоз = Left(Код, InStr(Код, "-") - 1)
Код = Right(Код, ДлиннаСтроки - InStr(Код, "-"))
ДлиннаСтроки = Len(Код)
Лесничство = Left(Код, InStr(Код, "-") - 1)
Код = Right(Код, ДлиннаСтроки - InStr(Код, "-"))
ДлиннаСтроки = Len(Код)
Квартал = Left(Код, InStr(Код, "-") - 1)
Код = Right(Код, ДлиннаСтроки - InStr(Код, "-"))
ДлиннаСтроки = Len(Код)
Выдел = Left(Код, InStr(Код, "-") - 1)
Код = Right(Код, ДлиннаСтроки - InStr(Код, "-"))
Делянка = Код
End Sub