Выбрать дату в календареВыбрать дату в календаре

Страницы: 1 2 След.
Как отследить открытие другой книги VBA
 
Цитата
Юрий М написал:
Для проверки напишите Stop в процедуре - тогда точно будете знать, срабатывает или нет.
Цитата
The_Prist написал:
Может ошиблись с именем книги и условие просто не выполняется.
Еще раз перепроверил, поставил stop, перезапустил, выяснил что имя неверно (пробел лишний).
Все работает! Спасибо!
Только группировки не раскрываются) ActiveSheet.Outline.ShowLevels RowLevels:=3
Как отследить открытие другой книги VBA
 
Когда открываются в разных, все работает, office 2013 и старше, а в 2010 в (все книги в одном окне) ставлю stop. не срабатывает.
Как отследить открытие другой книги VBA
 
Нет, процедура в общей книге макросов personal
Как отследить открытие другой книги VBA
 
Перезапускал. Что-то не могу понять, сейчас все работает. Может быть связано с тем, что на работе 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
Изменено: tkachev.al - 02.03.2017 18:15:45
Как отследить открытие другой книги VBA
 
Видимо я что-то сделал не так, при открытом приложении 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
Изменено: tkachev.al - 02.03.2017 15:40:55
Как отследить открытие другой книги VBA
 
The_Prist, спасибо!
Как отследить открытие другой книги VBA
 
Уважаемые форумчане! Подскажите пожалуйста! Есть книга (телефонный справочник), лежит на общем ресурсе, прав на изменения её у пользователей нет. Каждый раз при открытии книги я открываю определенную страницу, раскрываю группировку, и ctrl +f открываю окно поиска. Хотел автоматизировать, но не получается. Событие при открытии книги (сохраненное в общей книге макросов!) не срабатывает. Вопрос - как увидеть открытие книги из уже открытого приложения excel
Код
?Private Sub Workbook_Open()
    ' Если открыт телефонный справочник, открыть страницу КЭ, развернуть группировку
    If ActiveWorkbook.Name = Тел - справ.xls Then
            Sheets("КЭ").Select
            ActiveSheet.Outline.ShowLevels RowLevels:=3
    End If
End Sub
После копировании-вставки подряд более 30 строк код сильно тормозит, Application.CutCopyMode = False не помогает
 
RAN, Спасибо!
После копировании-вставки подряд более 30 строк код сильно тормозит, Application.CutCopyMode = False не помогает
 
Цитата
RAN написал:
У меня не тормозит. У меня на 20% просто подвесил Excel наглухо.  
Если верить диспетчеру задачь  - процессор на 100% пашет при выполнении этой процедуры.
После копировании-вставки подряд более 30 строк код сильно тормозит, Application.CutCopyMode = False не помогает
 
Михаил С.,   мне не нужны сразу больше 100 строк, но как вариант-сначала узнать количество подходящих под критерий записей и добавить разом все строки. Наверно работать будет быстрее). Спасибо!
Код
.Rows(iRow_Sd & ":" & iRow_Sd + 100 - 1).Insert Shift:=xlDown
После копировании-вставки подряд более 30 строк код сильно тормозит, Application.CutCopyMode = False не помогает
 
Код
       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, -мне нужно эту строку один раз скопировать в буфер, так?
После копировании-вставки подряд более 30 строк код сильно тормозит, Application.CutCopyMode = False не помогает
 
Я заранее не знаю, сколько строк нужно будет вставить, 5 или больше 100. поэтому, по одной. Сразу после вставки я редактирую эту строку и после этого. снова встаить строку из буфера, не получается. видимо её там (в буфере) уже нет)). Заранее подготовить избыточный диапазон с формулами, тоже вариант, но и как тогда его очищать, не сбивая формулы?
После копировании-вставки подряд более 30 строк код сильно тормозит, Application.CutCopyMode = False не помогает
 
Цитата
kuklp написал: У меня ничего не тормозит.
Вот маленький пример, как сильно тормозит код при копировании строки с формулами и форматированием.
После копировании-вставки подряд более 30 строк код сильно тормозит, Application.CutCopyMode = False не помогает
 
Dima S, Попробую завтра с утра что-нибудь придумать, чтоб выложить файл и не нарушить ни чьи права :).

строка
Код
iRow_Sd = iRow_Sd + 1
грубо говоря в цикле не участвует. она определяет строку на листе "Свод" - это просто следующая строка для вставки соответствующих критерию данных. А цикл
Код
For iRow_Rr = 6 To 500 
- по строкам другого листа - типа реестра, на котором и проверяется соответствие критерию  If wsh_Реестр.Cells(iRow_Rr, 1) Like Табельный Then
И вот просто добавление новой строки (скопированной, с формулами и усл форматированием) постепенно после 30 строки замедляется, это я вижу из статусбара
После копировании-вставки подряд более 30 строк код сильно тормозит, Application.CutCopyMode = False не помогает
 
Цитата
Dima S написал: у вас в конце перепрыгивает)
Что вы имеете ввиду?
Код
iRow_Sd = iRow_Sd + 1
Эту строку?
После копировании-вставки подряд более 30 строк код сильно тормозит, Application.CutCopyMode = False не помогает
 
 
Код
                 .Rows(iRow_Sd).Copy
                .Rows(iRow_Sd).Insert Shift:=xlDown
                Application.CutCopyMode = False 
                DoEvents
                Application.StatusBar = "Добавлена строка: " & iRow_Sd
Не помогло. Вот весь блок, но думаю, что проблема всетаки из-за копирования.
   
Код
 'очищаем лист свод
        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 строк код сильно тормозит, Application.CutCopyMode = False не помогает
 
Перед выполнением выполнены
Код
    Application.DisplayAlerts = False
    Application.Calculation = xlCalculationManual
    Application.ScreenUpdating = False
    Application.EnableEvents = False
После копировании-вставки подряд более 30 строк код сильно тормозит, Application.CutCopyMode = False не помогает
 
Нет, нету. Я и раньше такое замечал, сначала, быстро код выполняется , потом скорость падает.
После копировании-вставки подряд более 30 строк код сильно тормозит, Application.CutCopyMode = False не помогает
 
Здравствуйте, уважаемые форумчаене!
Подскажите пожалуйста, как можно устранить проблему:  после копирования - всавки больше 30 строк, код выполняется значительно медленнее и чем дальше тем медленнее.
Копирую шаблонную строку с формулами и форматированием. Обновление экрана и пересчет формул отключены.
Код
                .Rows(iRow_Sd).Copy
                .Rows(iRow_Sd).Insert Shift:=xlDown
                Application.CutCopyMode = False
                Application.StatusBar = "Добавлена строка: " & iRow_Sd
Подсчитать одной формулой количество частей текста, в продолжение темы "Распилить строку формулой"
 
vikttur, Спасибо!
Подсчитать одной формулой количество частей текста, в продолжение темы "Распилить строку формулой"
 
Здравствуйте, помогите пожалуйста собрать формулу, для подсчета количества кусочков строки разделенной ";"
В прошлый раз для распила строки 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, Спасибо огромное!
Открыть книгу открытую другим пользователем VBA
 
Цитата
Казанский написал:
ReadOnly:=True
Кажется справился, добавил цикл для поиска файла по маске, и получил полное имя файла.
Код
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
Открыть книгу открытую другим пользователем VBA
 
Цитата
Казанский написал:
Открывайте "для чтения", макрорекордер пишет
с
Код
Workbooks.Open Filename:= "C:\...", ReadOnly:=True
ничего не поменялось, видимо по маске открывать не хочет в приложении срины ошибок
Открыть книгу открытую другим пользователем VBA
 
Здравствуйте, для получения данных (лист отчета целиком) из другой книги собрал код, но он не работает :) не хочет рботать с открытой книгой. Общий доступ делать нельзя. Может нужно указать, что открыть только для чтения? 'Open Workbooks(Адрес6) For Input As #1 Но ошибка "subscript out of range"


Для проверки состояния книги позаимствовал функцию http://www.excel-vba.ru/chto-umeet-excel/kak-proverit-otkryta-li-kniga/ но она всегда выдает true, и при закрытой книге ??  пока не понял.
Код
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

И как её открыть . если адрес указан маской? (для чтения и без вопросов [продолжить?])
 
Распилить строку формулой на составные, Укоротить формулу
 
Юрий, спасибо! Для кода Split, в моем случае, в самый раз!   :)
Распилить строку формулой на составные, Укоротить формулу
 
Здравствуйте! Есть строка 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
Ближайшее значение по нескольким критериям
 
Андрей VG, Спасибо! Ничего похожего в других источниках (по гуглу)  пока не нашел.
Ближайшее значение по нескольким критериям
 
Цитата
jakim написал:
И такой вариант для XL2010+.
с "Агрегат" вообще как-то сложно для моего мозга  :) то что Влад, предложил мне понятнее.
http://www.planetaexcel.ru/forum/index.php?PAGE_NAME=message&FID=1&TID=75008&TITLE_SEO=75008-blizhay...  
Страницы: 1 2 След.
Наверх