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

Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 143 След.
Позднее связывание - ошибка variable uses an automation type not supported in visual basic
 
Цитата
testuser написал: ... для позднего ...  set wd = new iwebdirver
Добрый вечер, у Вас очевидно опечатка, т.к. New работает  только с ранним связыванием
Позднее связывание - ошибка variable uses an automation type not supported in visual basic
 
Добрый день, Игорь.
Похоже, что Cookies - это отдельный класс/объект, у которого есть метод AllCookies.
Позднее связывание может не справиться с раскручиванием такой цепочки Класс1-метод-Класс2-метод без явного доступа к Класс2 до вызова его метода.
Можно попробовать сначала достучаться до класса Cookies, а потом уже вызвать его метод AllCookies:
Код
Dim x
Set x = WD.Manage.Cookies
a = x.AllCookies

Если не сработает, то интересно посмотреть в отладчике в Locals, что там попало в 'x'.

С ранним связыванием тоже можно было бы поиграться, 2 варианта:
1. Устанавливать Reference программно при загрузке надстройки, не забывая его отключить в коде BeforeSaving.
2. Перед сохранением релиза надстройки установить  Reference на как можно более старую версию библиотеки.
Но после этого надстройки не должна сохраняться (поставить ReadOnly), чтобы не сохранялась связь с новой версией библиотеки.
Тогда Reference при загрузке надстройки будет автоматически подтягиваться к версии, установленной на компьютере клиента и код будет работать корректно. Если же надстройка сохранена с более поздней версией библиотеки, то у клиента с ранней версией возникнет ошибка MISSING.
Изменено: ZVI - 21.09.2022 03:37:26
Фильтрация по 2000 условий
 
Добрый день, Виталий!
Видно, что проделана большая работа, с учетом универсальности решения результаты очень впечатляющие!
Эти времена включают и время загрузки данных с листа Еxcel с выгрузкой на вновь созданный отдельный лист, как у Павла в #11, или с заменой исходных данных со сжатием ListObject, как  в #45?
Еще - в данных были не только текстовые, но и числовые значения, они переводились в текстовые?
Изменено: ZVI - 19.09.2022 11:23:44
Фильтрация по 2000 условий
 
Цитата
New написал: ZVI , спасибо
Рад, что как-то сработало!  :D
Фильтрация по 2000 условий
 
Цитата
bedvit написал: А как угадывает кодовую страницу LCase в VBA?
Быстро 🙂
Что внутри - MS его знает...
Но Excel изначально эффективно ориентирован на поддержку мультиязычности и это видно по тестам
Недостаточно памяти при удалении строк
 
Добрый день. При выгрузках часто получается таблица со скрытыми ярлыками листов, что для некоторых конфигураций "железа" и ПО критично.
Если это так, то попробуйте в панели слева внизу, где должны быть видны названия листов, потянуть вправо за три вертикальных точки
Фильтрация по 2000 условий
 
Цитата
bedvit написал: Доброе утро
Доброе утро, Виталий!
Мне Ваш вариант с фильтром тоже понравился: эффективно, внешне просто, универсально.
С тормозами в C/C++ при преобразовании регистра сталкивался, правда, с посимвольным. Возможно, преобразование всей строки там быстрее, но нужно угадать еще и кодовую страницу. Проще LCase сделать в VBA.
Фильтрация по 2000 условий
 
Всем - доброе утро!
Вариант на чистом VBA.
На моем компьютере в режиме ISDEBUG=0 (с удалением строк) общее время 8.5 секунд.
Регистр не важен.
При ISDEBUG=1 (без удаления строк, отображаются номера строк стопов) общее время 8.3 секунды.
Данных: 273495 (из сообщения #24)
Стопов: 43603 (найдено в данных)
Разность: 229892

Код
Option Explicit

Sub DelRowsByStops()
'ZVI:2022-09-15 https://www.planetaexcel.ru/forum/index.php?PAGE_NAME=read&TID=152076#message1215688
'(post #45)
  
  Const ISDEBUG As Boolean = 1 ' 0/1 or False/True
  
  Dim a(), b()
  Dim i&, j&, k&
  Dim sWhere As String, sWhat As String, sDelim1 As String, sDelim2 As String, sDelim3 As String
  Dim rWhere As Range
  Dim bIsNum As Boolean
  Dim t As Single
  
  t = Timer
  
  If Not ISDEBUG Then
    Application.ScreenUpdating = False
    On Error GoTo exit_
  End If
  
  Debug.Print "ISDEBUG = " & IIf(ISDEBUG, 1, 0)
  
  If Лист1.FilterMode Then Лист1.ShowAllData
  Лист1.ListObjects(1).AutoFilter.ShowAllData
    
  sDelim1 = Chr(1)
  sDelim2 = Chr(2)
  sDelim3 = Chr(3)
  
  Set rWhere = Лист1.Range("A1").CurrentRegion.Columns(1)
  a() = rWhere.Value2
  ReDim b(2 To UBound(a))
  For i = 2 To UBound(a)
    b(i) = sDelim1 & i & sDelim2 & LCase(a(i, 1))
  Next
  sWhere = Join(b, sDelim3)
  ReDim b(1 To UBound(a), 1 To 1)
  If ISDEBUG Then
    b(1, 1) = "Стоп_№"
  End If
    
  a() = Лист2.Range("A1").CurrentRegion.Value2
  For i = 2 To UBound(a)
    sWhat = LCase$(a(i, 1))
    bIsNum = CStr(Val(sWhat)) = sWhat
    j = 1
    Do
      j = InStr(j, sWhere, sWhat)
      If j > 0 Then
        k = InStrRev(sWhere, sDelim1, j)
        If bIsNum Then
          If InStrRev(sWhere, sDelim2, j) > k Then
            k = Val(Mid$(sWhere, k + 1, 10))
            If ISDEBUG Then b(k, 1) = i Else b(k, 1) = 1
          End If
        Else
          k = Val(Mid$(sWhere, k + 1, 10))
          If ISDEBUG Then b(k, 1) = i Else b(k, 1) = 1
        End If
        j = j + Len(sWhat)
      Else
        Exit Do
      End If
    Loop
  Next
  
  Debug.Print "Main", Round(Timer - t, 3)
  rWhere.Columns(2).Value = b()
  
  If Not ISDEBUG Then
    With rWhere.Resize(, 2)
      .Sort Key1:=.Cells(1, 2), Order1:=xlAscending, Header:=xlYes
      i = WorksheetFunction.Count(.Columns(2))
      If i > 0 Then
        .Cells(2, 2).Resize(i).EntireRow.Delete
        .Columns(2).Clear
      End If
      .Cells(1, 2).Value = "Удалено: " & i
    End With
  End If
  With rWhere
    .Columns(2).EntireColumn.AutoFit
    .ListObject.Resize rWhere.Columns(1)
  End With
  
exit_:
  
  Application.ScreenUpdating = True
  Debug.Print "All", Round(Timer - t, 3)
  
End Sub

Если ListObjects не используются (обычные данные), то  закомментировать пару строк, где есть ListObject(s)
Изменено: ZVI - 15.09.2022 10:40:12
функция CBR дает неверный курс
 
Цитата
Татьяна Агафонова написала: Спасибо большое
Добрый вечер, Татьяна! Рад помочь  :)

P.S. Но если были сделаны наработки/шаблоны для многих пользователей Plex, то придется таки ждать обновления CBR в PLEX.
Изменено: ZVI - 08.09.2022 22:16:06
Не активны кнопки в надстройке
 
1. Если включить надстройку - OK, а затем выключить - OK, то на ленте вкладка Plex должна исчезнуть.
При включении наоборот - на ленте должна появиться вкладка Plex и нажатие её кнопок должно работаить.

2. Если на вкладке "Общие" справа внизу нет флажка "разблокировать", то файл уже был разблокирован


3. Либо правый клик на Excel.exe - Запуск от имени администратора,  
либо правый клик на ярлыке Excel (есть где-то в ПУСК) - Дополнительно - Запуск от имени администратора.
Изменено: ZVI - 07.09.2022 16:32:08
Долгий пересчет при ручном изменении, и быстрый при программном
 
Павел, спасибо!
Интересно, знают ли в MS про такие загадки? Вопрос риторический, конечно ))
Долгий пересчет при ручном изменении, и быстрый при программном
 
Цитата
New написал: Потестировал у себя.
Спасибо (Павел?), у меня разница приличная.
Можно ещё сохранить файл, закрыть Excel, в затем открыть в Excel и проверить, не открывая VBE.
Но, похоже, что эффект зависит от железа.
Долгий пересчет при ручном изменении, и быстрый при программном
 
Всем привет!
На моем компьютере нет зависимости тормозов от многопоточности.
Совет: проверьте тормоза с открытым и закрытым окном VBE  ;)

Код для тестирование в новой книге:
Код
Option Explicit

Sub TestingData()
  Range("A1").Value = 1
  Range("A2:A100000").Formula = "=x(A1)"
End Sub

Function x(a)
  x = a + 1
End Function
Изменено: ZVI - 07.09.2022 07:57:33
Не активны кнопки в надстройке
 
Добрый день, Александр.
Такое бывает, если надстройка перед установкой не была разблокирована:
1. Нужно в Excel отключить надстройку: в менеджере Excel-надстроек снять галочку и нажать OK.
Если там галочки не было, то сначала её поставить - OK, а потом снять - OK.
2. В проводнике - правый клик на XLAM - Свойства - Общие - справа внизу: 'Разблокировать'- OK
3. Загрузить Excel (лучше как администратор) и установить надстройку.
функция CBR дает неверный курс
 
Добрый день, Татьяна.
Функция CBR, наверное, выдает значение курса без учета номинала (количества валюты, для которого указан курс).
В данном случае номинал равен 10.
Но номинал, в зависимости от валюты, может быть: 1, 10, 100, 1000 …

Вот функция, которая учитывает номинал и не зависит от изменения порядка параметров и смещений структуры, скачиваемой с ЦБ:
Код
Function CbrNew(Optional ByVal OnDate, Optional Cur As String = "USD") As Double
  Static oDoc As Object
  If oDoc Is Nothing Then
    Set oDoc = CreateObject("msxml2.DOMDocument")
    oDoc.async = False
  End If
  If IsMissing(OnDate) Then OnDate = Date
  oDoc.Load "http://www.cbr.ru/scripts/XML_daily.asp?date_req=" & Format(OnDate, "DD\/MM\/YYYY")
  With oDoc.SelectSingleNode("//Valute[CharCode='" & UCase(Cur) & "']")
    CbrNew = Val(Replace(.SelectSingleNode("Value").Text, ",", ".")) / Val(.SelectSingleNode("Nominal").Text)
  End With
End Function

Чтобы получить курс USD на текущий день, можно параметры даты и валюты упустить:
=CbrNew() - посчитает 1 раз
или =CbrNew(СЕГОДНЯ()) - будет пересчитываться каждый раз
Другие примеры:
=CbrNew(;"EUR")
=CbrNew("24.08.2022";"TRY") но лучше избегать текстовых значений даты, см. ниже
=CbrNew(ДАТА(2022;8;24); "TRY")
=CbrNew(A1; "TRY") где дата - в A1, это оптимальный вариант, т.к. пересчет будет только при изменении A1

Надеюсь, что Николай в новой версии Plex использует такой же код для функции CBR().
Изменено: ZVI - 08.09.2022 22:23:24
Быстрое преобразование массива из одномерного в двухмерный и наоборот с сохранением всех данных (BedvitCOM v1.0.5.0 и выше)
 
Друзья, добрый день!

По поводу "моя/твоя":  на форуме есть авторы тем, но нет личных тем, всё колхозное:
1. Виктор (vikttur) - На форуме нет ЛИЧНЫХ тем.
2. Юра (Юрий М) - Тема фактически становится "собственностью" форума, а не Вашей.  

Алексей, про то, как в памяти хранятся массивы, и я и Виталий пытались разъяснить обычным языком.
Напомню и дополню немного:
Массив любых размерностей всегда состоит из одного непрерывного диапазона памяти.  
В каждом элементе массива хранится значение, а для типов String/Object– адрес значения/объекта вне массива: StrPtr/ObjPtr соответственно.
У каждого массива есть своя отдельная структура вне массива  (Type SAFEARRAY), описывающая количество элементов и LBound каждой размерности и т.п., в т.ч. и адрес начального элемента массива.

Так вот, весь трюк в быстром изменении размерностей и границ Lbound/Ubound заключается в том, чтобы не трогать сам массив, а поменять значения в структуре SAFEARRAY массива.

А то, чего хотите Вы – произвольно менять размерности, нашинковать, обрубая или наращивая массив, потребует медленно делать то, что делает Redim Preserve:
- создать новый массив вместо существующего
- скопировать элементы старого массива в новый
- разрушить старый массив - освободив память, чтобы исключить утечки памяти,

Redim Preserve итак реализован на C/C+, быстрее него не получится, и я так понимаю Виталия, что ему поэтому и
не интересно повторять то же самое. Просто сделайте в VBA обертку с Redim Preserve на подобные случаи, как и советует Виталий.
Изменено: ZVI - 31.08.2022 01:28:46
Универсальный обработчик событий контролов юзерформы
 
Это да. Тот человек, кстати, честно написал, что метод изначально он увидел когда-то на японском сайте.
Универсальный обработчик событий контролов юзерформы
 
Цитата
sokol92 написал: Прилагаю пример универсального обработчика
Владимир, спасибо - шикарный метод!  :)
Комбинаторика. Метод перестановок. Получить все перестановки элементов одномерного массива, Combinatorics. Permutation method. Get all Permutations of 1D-Array
 
Игорь, я уже все написал, что хотел по проблемам памяти и времени вычисления - читайте.
Ничего другого в этой теме я не обсуждал и не намерен.
По "руководствуюсь ... возможностями компьютера" тоже написал: потребуется полтысячи 4 ТБ-х дисков и 400 лет времени расчета по Вашему решению.  Если не видите проблем с ограничениями памяти - Ваше дело.
Ваш код не соответствует изначальной постановке задачи, задайте не 9, а 16 уникальных значения в массиве длиной по 4 символа каждый и сообщите, когда код сбойнет из-за нехватки места на диске.

P.S. Алексей учел, что 16! это слишком много и исправил на 8!
Изменено: ZVI - 28.08.2022 02:49:23
Комбинаторика. Метод перестановок. Получить все перестановки элементов одномерного массива, Combinatorics. Permutation method. Get all Permutations of 1D-Array
 
Цитата
Ігор Гончаренко написал: ...не любое, можно результаты писать сразу в файл, тогда решение упрется в обьем доступной памяти на диске
Игорь, любое. В моем сообщение о "памяти" - это о любой памяти.
Для сохранения результата потребовалось бы 523 шт 4-х терабайтных диска - это что, не проблема (дисковой) памяти?
На выполнение кода потребуется ~400 лет, напоминает известный "главный вопрос жизни, вселенной и всего такого", когда специально созданный компьютер непрерывно работал 7.5 млн лет и выдал результат 42.
Изменено: ZVI - 28.08.2022 02:42:04
Комбинаторика. Метод перестановок. Получить все перестановки элементов одномерного массива, Combinatorics. Permutation method. Get all Permutations of 1D-Array
 
Цитата
Ігор Гончаренко написал: ... вопрос же не в том где работает, а где нет
Игорь, любое решение с исходными условиями упрется в объем памяти.
Каждая строка съест ~100 Байт памяти, итого: 100 * 16!  = 2 092 278 988 800 000 Байт.
Даже если столько памяти насобирать, то сколько времени будет работать код?
И какой тогда смысл в конкретном коде?
Изменено: ZVI - 25.08.2022 01:26:11
Комбинаторика. Метод перестановок. Получить все перестановки элементов одномерного массива, Combinatorics. Permutation method. Get all Permutations of 1D-Array
 
Алексей, добрый день.
В Вашем примере списка 16 уникальных элементов - многовато для реального применения.
Нужно хранить 20 922 789 888 000 вариантов
Изменено: ZVI - 25.08.2022 01:05:17
вычисление значения по графику, как по полиномиальному графику вычислить значение неизвестного (у)
 
Цитата
Татьяна Кузнецова написала: если значения в столбцах поменять местами
Для кусочно-линейной интерполяции достаточно отсортировать по возрастанию X
Изменено: ZVI - 26.08.2022 11:43:47 (По просьбе Татьяны приложен еще и XLS для Open Office)
вычисление значения по графику, как по полиномиальному графику вычислить значение неизвестного (у)
 
Цитата
Татьяна Кузнецова написала: По Кусочно-линейной интерполяции как завести в ячейку расчет?
Приложил вариант кусочно-линейной интерполяции формулами в именах
Изменено: ZVI - 23.08.2022 00:14:38
вычисление значения по графику, как по полиномиальному графику вычислить значение неизвестного (у)
 
Вариант с функцией кусочно-линейной интерполяции
Изменено: ZVI - 21.08.2022 22:33:57
Кракозябры в excel, Отображение кириллицы в excel
 
Добрый день.
Посмотрите вариант здесь
назначить макросы на элемент управления список в excel
 
Добрый день.
Приложил вариант с выпадающим списком на листе.
Код прокомментирован.
Вопросы по созданию своей надстройки
 
Цитата
Симонова Екатерина написала: на этапе работы с Риббон возникла проблема
Добрый день, Екатерина.
Это сообщение о положительном результате проверки - все у Вас правильно в XML-коде написано.
Доработка макроса для переноса примечания к ячейке
 
Если, как в примере, нужно копировать видимые (отфильтрованные ячейки) одного листа на другой с такой же структурой, то можно так:
Код
Sub PasteToVisible1()
  
  Dim rArea As Range, rFrom As Range, rTo As Range
  
  On Error GoTo exit_
  
  'Запросить диапазон копирования (по умолчанию - выделенные ячейки)
  Set rFrom = Application.InputBox("Диапазон копирования", "Запрос", Default:=Selection.Address(0, 0), Type:=8)
  
  'Запросить лист вставки (любую ячейку на нем, т.к. структуры листов одинаковые)
  Set rTo = Application.InputBox("Любая ячейка на листе вставки", "Запрос", Type:=8)
   
  ' Скопировать области только видимых ячеек диапазлна rFrom листа-источника
  For Each rArea In rFrom.SpecialCells(xlCellTypeVisible)
    rArea.Copy rTo.Worksheet.Range(rArea.Address)
  Next
  
exit_:
  
  If Err Then MsgBox Err.Description, vbExclamation, "Ошибка!"
  
End Sub

При этом в диалоге на листе, куда нужно копировать, можно указать любую ячейку, и фильтровать этот лист необязательно.
На листе-источнике можно сначала выделить то, что нужно копировать, и это попадет в диалог макроса.
Ошибка (Debug) при выполнении AppActivate Application, На одном компьютере при выполнении AppActivate Application появляется ошибка (Debug). Команда нужна для активации ячейки после нажатии на кнопку на форме
 
Цитата
Jack Famous написал: любая ячейка активируется (можно в неё вводить) просто нажатием на неё
Алексей, все верно - в этом лишнем клике на ячейке и была проблема Автора темы, которую он описал в #3 .
В старых версиях (2010) работает и без Caption, а в новых - нет.
Изменено: ZVI - 09.08.2022 10:45:59
Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 143 След.
Наверх