Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Выбрать дату в календареВыбрать дату в календаре

Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 131 След.
Несовпадение значений при выгрузке из массива, vba
 
Цитата
KUDRIN написал: ZVI, спасибо
К сожалению, нет встроенной возможности отключить навязчивый интеллект Excel, надеюсь, предложенное VBA-решение поможет Вам его обойти :)
Vladimir Zakharov
Microsoft MVP – Excel
Несовпадение значений при выгрузке из массива, vba
 
Владимир (sokol92) отметил, что первый вариант кода все же может в некоторых случаях конвертировать текст в дату, цитата:
Функции IsDate и IsNumeric учитывают региональные настройки, а Excel при прнятии решения о преобразовании заносимого в ячейку текста в число/дату  - нет. Например, при стандартных региональных настройках Windows-1251 (в частности, разделитель дробных разрядов - запятая) он преобразует "1,234,567" и "Apr 2".
Поэтому рекомендую 2-й вариант кода, он и проще и надежнее.
Владимир, спасибо!
Изменено: ZVI - 2 Апр 2018 10:17:11
Vladimir Zakharov
Microsoft MVP – Excel
Несовпадение значений при выгрузке из массива, vba
 
При желании можно упростить добавляемый фрагмент:
Код
      ' --> Фрагмент кода для предотвращения преобразования текстовых данных в нетекстовые
      If VarType(a(i, j)) = vbString Then
        If Len(a(i, j)) > 0 Then a(i, j) = "'" & a(i, j)
      End If
      ' <-- Конец фрагмента

Это исключит формулы в ячейках, но добавит (невидимый) символ "'" в начале всех ячеек с текстовыми значениями
Vladimir Zakharov
Microsoft MVP – Excel
Несовпадение значений при выгрузке из массива, vba
 
В любом случае подразумевается, что данные исходного массива будут циклически обрабатываться перед копированием на лист.
В эту обработку несложно добавить фрагмент кода для корректировки текстовых значений массива с целью предотвращения их преобразования при копировании массива в диапазон с общим форматом ячеек.
Код
Sub SafeArrayToRange()
' ZVI:2018-04-02 https://www.planetaexcel.ru/forum/index.php?PAGE_NAME=read&TID=103060
' Обработка массива для копирования на лист с предотвращением преобразования текстовых данных
  
  Dim ch As String
  Dim a(), i As Long, j As Long
  
  ' Скопировать данные в массив
  a() = Лист3.Range("A1:D20")
  
  ' Обработать данные массива
  For i = 1 To UBound(a)
    For j = 1 To UBound(a, 2)
      
      ' --> Здесь Ваша обработка элементов массива
      '     ...
      ' <-- Конец обработки
      
      ' --> Фрагмент кода для предотвращения преобразования текстовых данных в нетекстовые
      If VarType(a(i, j)) = vbString Then
        If Len(a(i, j)) > 0 Then
          ch = Mid$(a(i, j), 1, 1)
          If ch = "'" Then
            a(i, j) = "=""" & a(i, j) & """"
          ElseIf IsNumeric(a(i, j)) Or IsDate(a(i, j)) Then
            a(i, j) = "'" & a(i, j)
          End If
        End If
      End If
      ' <-- Конец фрагмента
      
    Next
  Next
  
  ' Скопировать данные массива на лист1 без преобразования текстовых данных
  With Лист1.Range("A1:D20")
    .NumberFormat = ""
    .Value = a()
  End With

End Sub
Vladimir Zakharov
Microsoft MVP – Excel
Ускорение работы Excel.
 
Цитата
Xat написал: Информацию копирую с сайта в эту таблицу
Собственно, это и есть причина - на сайтах разметку делают по разному и при копировании через буфер обмаена могут скопироваться прямоугольнички с нулевой шириной или высотой, расположенные по линиям сетки. Затем при копировании таких ячеек внутри книги копируются и эти объекты. При значительном количестве объектов Excel начинает тормозить даже при обычном перемещении курсора по ячейкам.
Изменено: ZVI - 29 Мар 2018 21:45:15
Vladimir Zakharov
Microsoft MVP – Excel
ошибка копирования картинок в excel 2016
 
Цитата
Dima S написал: Вроде все работает.
Спасибо, что сообщили результат! Меня он интересовал, да и многим другим может быть полезен.
Vladimir Zakharov
Microsoft MVP – Excel
Проблема с работой макроса в Excel 2016(32). Workbooks.Open и EnableEvents
 
Имитация зависания для обнаружения 2-х экземпляров Excel на вкладке "процессы"  диспетчера задач (удобно отсортировать там по имени)
Код
Sub Test()
  Dim App As Application
  Set App = New Application
  Stop      ' <-- Имитация зависания, в диспетчере задач 2 экземпляра объекта Excel
  App.Quit  ' <-- и даже после этой строки будут 2 экземпляра пока не выполнится End Sub
End Sub
Vladimir Zakharov
Microsoft MVP – Excel
Открывать выпадающий список с первой строки
 
Наверное, проще всего в запасных ячейках ниже ячейки с троеточием записать пробелы.
Например, в пустые ячейки AC531:AC533 для выпадающего списка вида работ листf [50]
Vladimir Zakharov
Microsoft MVP – Excel
Как копировать даные с ячейки в другие со смещением через интервал времени 5 минут
 
Давал ссылки по этой тематике здесь.
Там есть примеры с интервалом в минуту, которые несложно изменить и на 5 минут.
Vladimir Zakharov
Microsoft MVP – Excel
ошибка копирования картинок в excel 2016
 
Перед циклом и после каждого Paste желательно добавить Application.CutCopyMode=False для очистки памяти.
И на всякий случай временно для исключения внешних виновников отключите OneDrive, Skype и прочие программы, завязанные на анализ "на лету" буфера обмена.
Vladimir Zakharov
Microsoft MVP – Excel
Проблема с работой макроса в Excel 2016(32). Workbooks.Open и EnableEvents
 
Цитата
RAN написал: интересное окошко
Так и отладим по кусочкам :)
Дмитрий правильно рекомендует - включите для отладки xlApp.Visible = True.
Еще в коде очистка памяти не выполняется при Exit Sub, а очистки Set  wbOpen = Nothing вообще нет, посмотрите рекомендацию по очисткае памяти в моем коде сообщения #8. Важен еще порядок очистки, должно быть как в том сообщении.
Изменено: ZVI - 27 Мар 2018 21:53:11
Vladimir Zakharov
Microsoft MVP – Excel
Проблема с работой макроса в Excel 2016(32). Workbooks.Open и EnableEvents
 
Цитата
RAN написал: почему при перезагрузке Excel не включается обработка событий?
Если был принудительно закрыт первый экземпляр, то второй невидимый же в памяти остается, поэтому любое новое открытие книги по умолчанию выполняется в экземпляре, находящемся в памяти (если есть), а там события были отключены Вашим кодом. Удаляйте все (оба) экземпляры из памяти и проблемы не должно быть
Изменено: ZVI - 27 Мар 2018 21:44:33
Vladimir Zakharov
Microsoft MVP – Excel
Проблема с работой макроса в Excel 2016(32). Workbooks.Open и EnableEvents
 
Цитата
RAN написал: Проблемы возникли при попытке работы из дома (подключение не по локальной сети, а через интернет)
В зависимости от того, как организовано удаленное подключение, доступа к файлу по предполагаемому пути может и не быть - добавьте все же проверку.
И добавьте отложенный запуск: загрузка некоторых процессов в Excel происходит асинхронно, код Workbook_Open может начать выполняться до полной загрузки, когда доступ к объектной модели Excel неполный. Задержка в предложенном варианте - минимальная, ее почти нет (см. Now), но есть.

Цитата
sokol92 написал: ... при обработке этого события в первой открываемой рабочей книге
Владимир, все верно - этот случай. Такие проблемы начались еще с Excel 2002 (кто помнит)
Изменено: ZVI - 27 Мар 2018 21:35:38
Vladimir Zakharov
Microsoft MVP – Excel
Проблема с работой макроса в Excel 2016(32). Workbooks.Open и EnableEvents
 
Добрый вечер, Андрей.
Похоже, что в примере кода есть опечатки. На всякий случай отмечу их:
Вот эта строка ошибочна: Set xlApp = New Excel.Application.EnableEvents = False
Должно быть:  Set xlApp = New Excel.Application
Не объявлена переменная kas
Не хватает 2-х End With
Также нет проверки существования файла, который открывается во 2-м экземпляре Exc el.

Главная рекомендация: всегда до выполнения каких-либо действий с объектами давайте Excel загрузиться полностью.
Для этого переименуйте Workbook_Open с Вашим кодом в Workbook_Open1 , а в новой процедуре Workbook_Open напишите одну строку кода для отложенного запуска кода Workbook_Open1:
Код
Option Explicit

Private Sub Workbook_Open()
  Application.OnTime Now, Me.CodeName & ".Workbook_Open1"
End Sub

Private Sub Workbook_Open1()
  Me.Sheets("ОТЧЕТ").Protect Password:="123", DrawingObjects:=True, Contents:=True, Scenarios:=True, _
     AllowInsertingRows:=True, AllowDeletingRows:=True, AllowSorting:=True, _
     AllowFiltering:=True, UserInterfaceOnly:=True
  meUpdate
End Sub

Sub meUpdate()
  '..........
  Dim kas As String ' <-- было пропущено
  Dim wbOpen As Workbook
  Dim xlApp As Application
  With Me.Sheets("ОТЧЕТ")
    '.......................
    kas = Me.Sheets("ДАНО").ListObjects("tblKassa").DataBodyRange(1).Value
    
    ' Проверить, что требуемый файл существует
    If Dir(kas) = "" Then
      MsgBox "Не найден файл:" & vbLf & kas, vbCritical, "Ошибка"
      Exit Sub
    End If
    
    Set xlApp = New Excel.Application ' <-- здесь было лишнее
    With xlApp
      .EnableEvents = False
      '.Visible = True
      Set wbOpen = .Workbooks.Open(kas, , True)
      With wbOpen.Sheets("КАССА")
        '.......................
      End With
    End With  ' <-- было пропущено
  End With    ' <-- было пропущено
  
  ' Закрыить книгу wbOpen и экземпляр приложения xlApp с освобождением памяти
  wbOpen.Close False
  Set wbOpen = Nothing
  xlApp.Quit
  Set xlApp = Nothing
  
End Sub
Изменено: ZVI - 27 Мар 2018 20:50:02
Vladimir Zakharov
Microsoft MVP – Excel
Сообщение об изменившейся ячейке
 
Цитата
Allev написала: Рано я радовалась
Приложенный вариант поспокойнее будет, попробуйте
Код
Private Sub Worksheet_Calculate()
  Static OldValue
  With Me.Range("D2")
    If .Value <> OldValue Then
      If .Value <> 7 Then
        MsgBox "D2 <> 7", vbCritical, "ОШИБКА!"
      End If
    End If
    OldValue = .Value
  End With
End Sub
Изменено: ZVI - 23 Мар 2018 14:55:35
Vladimir Zakharov
Microsoft MVP – Excel
Удаление информации по системному времени
 
Добро пожаловать на форум! :)
Примеры кода макросов Test1  и Test2, запускающих макрос DelMacro очистки ячеек A1:B2 листа1 приведены ниже. Подробнее про OnTime можно почитать в VBA-справке.
Код
Dim dt As Date

Sub DelMacro()
  ' Макрос очистки ячеек A1:B2 листа1
  Лист1.Range("A1:B2").ClearContents
End Sub

Sub Test1()
  ' Очистить A1:B2 через 5 секунд
  Application.OnTime Now + TimeValue("00:00:05"), "DelMacro"
End Sub

Sub Test2()
  ' Очистить A1:B2 сегодня в 14:20
  dt = TimeValue("14:20:00")
  Application.OnTime dt, "DelMacro"
End Sub

Sub Auto_Close()
  ' Если книга закрывается раньше запланированного времени очистки ячеек, то нужно отменить запланированное задание
  If dt <> 0 Then
    Application.OnTime dt, "DelMacro", Schedule:=False
  End If
End Sub
Изменено: ZVI - 23 Мар 2018 01:26:34
Vladimir Zakharov
Microsoft MVP – Excel
Сообщение об изменившейся ячейке
 
Цитата
Allev написала: ... MsgBox "Сообщение" ...
Это функция макросов, без которых желаемое не получится.
Приложил пример того, что  советовали, для работы макросы должны быть разрешены.
Изменено: ZVI - 23 Мар 2018 01:04:24
Vladimir Zakharov
Microsoft MVP – Excel
Баг с форматом ячеек при открытии файла
 
Цитата
dxn написал: Можно ли как то и это поправить?
Похоже, что в этих ячейках использовался тот факт, что по умолчанию в обычном стиле по умолчанию применялся формат даты.
Полагаю, что теперь достаточно один раз обычным способом через формат ячеек задать для данного столбца требуемый формат даты и подобных сбоев быть не должно.
Изменено: ZVI - 23 Мар 2018 00:43:15
Vladimir Zakharov
Microsoft MVP – Excel
Ошибка при открытии файла Excel: файлы при работе с внешнего диска повредились
 
По теме правильно советовали: тестировать только на рабочем компьютере.
Если там книга не загрузится, то добавить к расширению файла .XLSX еще и .ZIP
Получится что-то типа ИмяФайла.XLSX.ZIP
Затем такой файл попытаться открыть в архиваторе, если внутри архива есть папка XL, в которой и хранятся данные книги, то восстановлением можно заняться.
Vladimir Zakharov
Microsoft MVP – Excel
Ошибка при открытии файла Excel: файлы при работе с внешнего диска повредились
 
Цитата
Юрий М написал: сам себе назначил формат Дата
Такая проблема недавно решалась в теме: Баг с форматом ячеек при открытии файла
Vladimir Zakharov
Microsoft MVP – Excel
Баг с форматом ячеек при открытии файла
 
Такая проблема когда-то была, по-моему, еще в Excel 2007.
Проблема была связана с изменением числового формата в стиле "Обычный" (Normal), там по умолчанию стоял формат даты вместо общего.
У Вас, возможно, в процессе работы кто-то пользуется искаженным стилем "Обычный": либо установлен на конкретном компьютере, либо копируются ячейки вместе с искаженным стилем из старой книги. Такая проблема легко "приклеивается" при общем доступом к книге.
Исправлялась так: Главная - Стили ячеек - правый клик на стиле 'Обычный' -  Изменить - Формат - вкладка 'Число' - Общий - OK - OK
Проще всего повесить на открытие книги макрос, выполняющий описанные выше действия:
ThisWorkbook.Styles("Normal").NumberFormat = ""
Изменено: ZVI - 18 Мар 2018 19:52:51
Vladimir Zakharov
Microsoft MVP – Excel
Определение последней строки с данными (если неизвестно какой столбец больше)
 
Виктор, когда-то эти нюансы мы обсуждали в теме  Последняя ячейка при скрытых столбцах/строках
Изменено: ZVI - 18 Мар 2018 18:05:39
Vladimir Zakharov
Microsoft MVP – Excel
Определение последней строки с данными (если неизвестно какой столбец больше)
 
Цитата
vikttur написал: будет видна ошибка определения строки в тесте4
Тесты 4 и 5 и так выдают 20 строк, а это вряд ли то, что хотелось (явные данные A1:B9 - 9 строк) - толкование результата зависит от намерений авторов кода, конечно.
Вообще, нужно признать, что Excel все делает правильно, но по своим, а не нашим правилам
Изменено: ZVI - 18 Мар 2018 18:04:31
Vladimir Zakharov
Microsoft MVP – Excel
Определение последней строки с данными (если неизвестно какой столбец больше)
 
Цитата
Юрий М написал: так нечестно
Ну, Excel же может себя вести нечестно :)
Еще можно и без автофильтра вручную скрыть строки 7:9 данных.
А некоторые варианты ведь и без скрытия/фильтрации строк могут озадачить
Изменено: ZVI - 18 Мар 2018 17:38:13
Vladimir Zakharov
Microsoft MVP – Excel
Определение последней строки с данными (если неизвестно какой столбец больше)
 
Посмотрите результаты предложенных выше вариантов на приложенном примере ;)
Изменено: ZVI - 18 Мар 2018 17:26:58
Vladimir Zakharov
Microsoft MVP – Excel
Ускорение работы Excel.
 
Иногда бывает то, о чем написал Дмитрий в сообщении #8 - при отображении разметки страниц листа задействуется и тормозит обычную навигацию на листе драйвер принтера. В такой режим можно попасть не только из Вид - 'Разметка страниц' или 'Страничный режим', но и после предварительного просмотра или экспорта в PDF. В некоторых случаях (зависит от драйвера принтера), даже без каких-либо действий на листе автофигуры начинают периодически вам подмигивать.
Устраняется таким кодом (публиковал когда-то):
Код
Sub FasterFaster()
  Dim Sh As Worksheet
  Application.ScreenUpdating = False
  Application.EnableEvents = False
  With ActiveSheet
    For Each Sh In Worksheets
      Sh.DisplayAutomaticPageBreaks = False
      Sh.Activate
      ActiveWindow.View = xlNormalView
    Next
    .Activate
  End With
  Application.ScreenUpdating = True
  Application.EnableEvents = True
End Sub
Изменено: ZVI - 15 Мар 2018 12:13:33
Vladimir Zakharov
Microsoft MVP – Excel
Ускорение работы Excel.
 
Причина таких тормозов может быть в том, что на листе много объектов-прямоугольников с нулевой высотой или шириной, поэтому их не видно. Можно сохранить книгу в XLS-формате и удалить их так:
Код
Sub ShapesDelete()
  ActiveSheet.Rectangles.Delete
End Sub

или более цивилизованно:
Код
Sub ShapesDelete1()
  Dim i As Long
  i = ActiveSheet.Rectangles.Count
  If i > 0 Then
    If MsgBox("Удалить объекты-прямоугольники, " & i & " шт ?", vbYesNo) = vbYes Then
      ActiveSheet.Rectangles.Delete
    End If
  Else
    MsgBox "Объектов прямоугольников на листе нет"
  End If
End Sub

В XLS формате удаление мгновенное, а в современном формате книги удаление может выполняться о-о-чень долго. После удаления - сохранить в нужном формате.

Можно и без конвертирования в XLS:
1. Закрыть Excel
2. Переименовать "MyFile.xlsx" to "MyFile.xlsx.zip"
3. Открыть архив "MyFile.xlsx.zip" в проводнике или архиваторе, удалить папку внутри архива:
XL\DRAWINGS и сохранить изменения
4. Переименовать обратно "MyFile.xlsx.zip" в "MyFile.xlsx"
5. Открыть "MyFile.xlsx" в Excel, игнорируя предупреждение об удалении автофигур, сохранить книгу.
После этого все будет по-быстрому.
Изменено: ZVI - 15 Мар 2018 13:07:01
Vladimir Zakharov
Microsoft MVP – Excel
Как в макросе задать условие "если ошибка" - #ЗНАЧ!
 
Код
If IsError(ActiveCell.Value) Then MsgBox "В ячейке - ошибка!"
Vladimir Zakharov
Microsoft MVP – Excel
Запуск по расписанию макроса с аргументами
 
Цитата
Sanja написал: Владимир, спасибо!
Виталий, всегда рад поделиться знаниями :)

Цитата
stahon написал: И за дополнение спасибо
А это уже не из знаний, а из опыта. Приятно, что и это пригодилось, удачи Вам!
Vladimir Zakharov
Microsoft MVP – Excel
Запуск по расписанию макроса с аргументами
 
При запуске OnTime с параметром есть один нюанс  - если нужно отменить уже заряженный запуск по Schedule:=False (например, при закрытии книги), то требуется указывать не только имя процедуры, но и тот же параметр:
Application.OnTime EarliestTime:=SavedTimeToRun, Procedure:="'Лист4.Poll " & SavedNumber & "'", Schedule:=False
здесь SavedTimeToRun - глобальная переменная, в которой сохранена дата и время отложенного запуска макроса, а SavedNumber  - глобальная переменная, в которой сохранено значение параметра Number, посланного в OnTime.
Vladimir Zakharov
Microsoft MVP – Excel
Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 131 След.