Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Excel VBA (часть 3)

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213

Открыть новую тему     Написать ответ в эту тему

ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

 
 
Обсуждаем вопросы только по Excel VBA
(программирование макросов, скриптов, пользовательских функций и т.п.).
Приветствуются ссылки на ресурсы и справочную литературу по теме.
 
Вопросы по работе с MS Excel, не относящиеся к программированию, задаем в теме Excel FAQ

 
Обратите внимание, этот топик для помощи в изучении и использовании VBA. Посему запросы типа "Напишите мне такой-то макрос, я VBA не знаю и знать не хочу" не приветствуются.
Древняя мудрость: "Накорми голодного рыбой и он погибнет, научи его ловить рыбу и ты спасешь его."(R)
 
Предыдущие ветки топика: Часть 1, Часть 2
 
Информация общего характера:
  • Список соответствия имен функций в английской и русской версиях Excel
  • Описание Microsoft Excel File Format (eng.)
     
    Рекомендации:
    Если у Вас есть проблема, не решаемая стандартными средствами Excel (об этом можно уточнить здесь) или требующая автоматизации, попробуйте для начала записать макрос самим Excel через меню Сервис (Tools) - Макрос (Macro) - Начать запись (Record New Macro). Подробнее здесь. В большинстве случаев получившийся код (Сервис-Макрос-Макросы-Изменить) Вас не удовлетворит, но подскажет, какие объекты-методы-свойства использовать.  
    Другой Ваш помощник - Просмотр объектов (Object Browser). Ну и встроення помощь (F1), естественно.
     
    Если Вы в тупике, покажите Ваш код (или часть кода) здесь.  Если вылазит ошибка, цитируйте ее полностью. Если код слишком большой, используйте тeг [more].
    Используйте отладчик - Breakpoints (F9), Watches (Shift-F9), Steps (F8 и др.) Сильно облегчает поиск ошибок.

     
    Рекомендуется к прочтению:
  • Первые шаги с Excel VBA
  • Excel VBA: Приёмы программирования
  • WinApi. Лекция из курса "Основы офисного программирования и язык VBA" (для продвинутых)
  • Daily Dose of Excel (eng.) - тематический блог: советы по работе с Excel и прочие материалы
  • Excel Macros & Excel VBA Code Tips, Tricks (eng.) - советы, трюки и уловки
  • Mr. Excel (forum) (eng.) - весьма оживленный форум по Excel&VBA.
  • Приемы, хитрости, трюки и нюансы работы в Microsoft Excel - сайт "Планета Excel", целиком посвященный Excel и всему, что с ним связано.
  • Microsoft Excel: Таблицы и VBA. Справочник. Вопросы и Ответы. Советы. Примеры.  
     
    Родственные топики:
  • Вопросы по работе с MS Excel - Excel FAQ - часть 1, часть 2, часть 3
  • Технические проблемы с MS Office 2003 или Office XP.
  • Word VBA все вопросы по Word VBA туда
  • Access все вопросы по программированию в Access туда
  • Книжульки по VBA - книги по программированию с использованием VBA
     
    Конкретные вопросы:
    Форма-заставка
    Как запустить макрос при изменении положения курсора или значения ячейки
  • Пример 1
  • Пример 2
  • Пример 3 (проверка области)
  • Пример 4
  • Пример 5
    Зацикливание в функции Change или SelectionChange
     
    Ранжирование без пробелов (макрос включает функции сортировки массива и удаления дубликатов, работает и в Excel 2007)
  • под Office 97
     
    Добавление в главное меню своего пункта, ассоциированного с макросом
    Создание ярлыка на рабочем столе
    Снятие защиты листа при забытом пароле
    Смена раскладки клавиатуры
    Скролл формы колесом прокрутки мыши
    Оптимизация кода по быстродействию использованием массивов
    Найти "чужое" окно и нажать в нем кнопку (вписать текст в текстовое поле)
    Работа с UNICODE-символами в VBA: запись, чтение из ячейки, перевод в ASС и обратно
    Как программно подключить дополнительные библиотеки (например, "Microsoft Scripting Runtime" или "Microsoft ActiveX Data Objects 2.8 Library) через References
     
    Перечень основных ColorIndex'ов из MSDN
     

    Смежные темы:
    Программы » Microsoft Office 2019 & 365 | 2016 | 2013 | 2010 | 2007 | 2003
    Программы » OneNote | Outlook 2013 & 2016 & 2019 | Outlook 2010 | Microsoft Mathematics & Math Solver
    Программы » Word FAQ | Excel FAQ | Access FAQ
    Прикладное программирование » Word VBA | Access VBA  
    Андеграунд » Microsoft Office 2019 | 2016 | 2013 | 2010 | 2007 | 2003
    Андеграунд » OneNote | Visio | SharePoint Server | Project Server | Exchange Server
    Андеграунд » Надстройки (add-ins) и коммерческие макросы Excel
    Андеграунд » Самостоятельная сборка дистрибутивов Оffice 2007/2010/2013/2016 | MUI для Office 2007

  • Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 10:16 11-01-2010 | Исправлено: ALeXkRU, 16:42 03-08-2021
    jollyboy

    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    komputeryuzer
    Не понятно - в чем проблема?  
    Что значит:

    Цитата:
    как определить десятичные разяды чисел?
    как определить два знака или три после запятой

    Как я понял - вот, три (степень десятки) разряда после запятой:
    ? Int((1.23456 - Int(1.23456)) * 10^3)

    Всего записей: 30 | Зарегистр. 30-10-2012 | Отправлено: 22:45 12-11-2012
    AndVGri

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    komputeryuzer

    Цитата:
    раньше пользовался  либо % либо мод().

    Подскажите, где вы использовали это для чисел вида

    Цитата:
    апример 12,12 или 12,123

    Для чисел с плавающей запятой двойной точности, используемых в Excel, не всё так просто в плане определения числа знаков после запятой, почитайте, для разнообразия
    Подумайте, сколько знаков после запятой у числа 1/3?
    Как вариант для подсчёта числа знаков после запятой могу предложить

    Код:
     
    Public Function DigitAfter(ByVal this As Double) As Long
        Dim sText As String, posD As Long, posE As Long
        sText = Replace(CStr(this), ",", ".")
        posD = InStr(sText, "."): posE = InStr(sText, "E")
        If posD = 0 Then
            DigitAfter = 0
        ElseIf posE = 0 Then
            DigitAfter = Len(sText) - posD
        Else
            If Mid$(sText, posE + 1, 1) = "-" Then
                DigitAfter = CLng(Mid$(sText, posE + 2)) + posE - posD - 1
            Else
                DigitAfter = 0
            End If
        End If
    End Function
     

    P. S. Рассмотрены не все варианты. Будет некорректно обрабатываться, например, 1E-102

    Всего записей: 750 | Зарегистр. 14-12-2005 | Отправлено: 03:09 13-11-2012 | Исправлено: AndVGri, 03:23 13-11-2012
    komputeryuzer

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AndVGri
    Цитата:
    Подумайте, сколько знаков после запятой у числа 1/3?  
    спасибо
    необходимо в пределах разумного.. для производства.. нарпимер как узнать сколько знаков после запятой 0 или 1 или 2 или 3 или 4 или больше
    это денежные суммы которые указаны в поступающих  документах.. и надо из обрабатывать по разному...
    я пошол по другому пути... сварганил нечто такое
    IIf(InStr(StrReverse(Str(  селс( ров, сол)  )), ".") > 3, ....
    дешевоисердито

    Всего записей: 762 | Зарегистр. 21-04-2010 | Отправлено: 12:05 13-11-2012
    jollyboy

    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    komputeryuzer
    Цитата:
    это денежные суммы которые указаны в поступающих  документах.. и надо из обрабатывать по разному...  

    У бухов не может быть таких сумм (чисел). И для бухов есть соответствующий тип данных - currency. И есть принятые правила округления. В смысле - все это должно быть :)
     

    Цитата:
    я пошол по другому пути... сварганил нечто такое
    IIf(InStr(StrReverse(Str(  селс( ров, сол)  )), ".") > 3, ....
    дешевоисердито

    Впечатляет. Сердито, но не дешево :)
     
    Попробуй:  
    (Len(CStr(x - Int(x))) - 2) > 3 ' для локали с лидирующим нулем
     
    И завязывай с этим олбанским: "селс( ров, сол) " - пиши по-людски.

    Всего записей: 30 | Зарегистр. 30-10-2012 | Отправлено: 12:52 13-11-2012
    komputeryuzer

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    jollyboy
    Цитата:
    1.23456 - Int(1.23456)
    да остроумно.. я не подумал об этом.. вот почему выкинули отдельную функцию?!..
     

    Всего записей: 762 | Зарегистр. 21-04-2010 | Отправлено: 13:19 13-11-2012
    jollyboy

    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    komputeryuzer
    Цитата:
    вот почему выкинули отдельную функцию?!..  

    Я, честно говоря, не поню, чтобы она была...

    Всего записей: 30 | Зарегистр. 30-10-2012 | Отправлено: 13:36 13-11-2012
    komputeryuzer

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    не в вба.. в других языках.. я думал что инт, лен и мод итд должны быть..

    Всего записей: 762 | Зарегистр. 21-04-2010 | Отправлено: 16:30 13-11-2012
    panda3

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    При представлении числа в формате IEEE 754 (которое использует Excel в общем случае для дробных чисел) количество цифр после запятой будет иметь конечное значение только для дробей, у которых знаменатель является степенью двойки, например 0,673828125 = 345/512. Для всех остальных чисел количество цифр после запятой по определению бесконечно. Поэтому определять количество цифр нужно не для числа, а для его строкового представления, полученного при предварительном округлении до нужного числа знаков. Скажем, число 0.1 при предварительном округлении до 5 знаков, даст строку "0.1", т.е. один знак после запятой, это же число при предварительном округлении до 18 знаков даст строку "0.100000000000000006" - будет уже 18 знаков после запятой.

    Всего записей: 203 | Зарегистр. 06-02-2007 | Отправлено: 09:41 15-11-2012
    me4me

    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    panda3
    Это, конечно, все хорошо. Только, вот, надо ли?
    Если человек в ответ на  
    ? 10 / 3
    сознательно, здраво аргументировано говорит: "Мне мало", то тогда он, кончено, должен погрузиться в описанное тобой.  
     
    А когда это чисто обывательский интерес, надо сразу сказать ему - "Забудь, не думай!" Ну, постараться не обидеть при этом :)
     
    Надо вообще взять за правило все буховские задачи для планктона принудительно решать в целочисленном контексте. Тогда всем будет щазтье :) Они не будут забивать мозг ни себе, ни другим.

    Всего записей: 49 | Зарегистр. 15-11-2012 | Отправлено: 04:23 16-11-2012
    komputeryuzer

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    как проверить открыт ли такой то ексел?
    как проверить есть ли лист в таком то открытом екселе?

    Всего записей: 762 | Зарегистр. 21-04-2010 | Отправлено: 10:24 16-11-2012
    Maximus777

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    У кого-нибудь есть пример парсера HTML-кода на VBA?

    Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 14:37 16-11-2012
    andrewkard1980

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    как проверить открыт ли такой то ексел?  

    Dim wbk As Workbook
     
     
    Set wbk = Workbooks("ХХХ.xls")
    If Not IsEmpty(wbk) Then
    'your code here
    else
    Msgbox ("Workbook is not open")
    End if
     
    Добавлено:

    Цитата:
    как проверить есть ли лист в таком то открытом екселе?

     
    Наверное можно аналогично предыдущему сообщению.
     
    Добавлено:

    Цитата:
    У кого-нибудь есть пример парсера HTML-кода на VBA?


    Код:
         
    Dim oHTTP as object, sURL$
    sURL = "http://ya.ru"
        Set oHTTP = CreateObject("MSXML2.XMLHTTP")
        With oHTTP
            .Open "GET", sURL, False
            .Send
            sHTML = .responseText
        End With
        Set oHTTP = Nothing
     

    Всего записей: 209 | Зарегистр. 01-05-2010 | Отправлено: 15:21 16-11-2012
    komputeryuzer

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    andrewkard1980спасибо.. они не тяжеловесные команды? думал есть какой нибудь лёгкий оператор типа ексист("ееее")...
    дело в том что когда файл не открыт вба выдает ошибку и мы открываем файл и запускаем скрипт поновой.. может оставить так? овчинка выделки стоит?

    Всего записей: 762 | Зарегистр. 21-04-2010 | Отправлено: 15:43 16-11-2012
    Maximus777

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    andrewkard1980
    благодарю. Дальше уже разберусь.

    Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 17:10 16-11-2012
    andrewkard1980

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    дело в том что когда файл не открыт вба выдает ошибку

    поставьте обработчик ошибок либо просто перебором:

    Код:
    For Each Workbook In Application.Workbooks
    If Workbook.Name = "ХХХ" Then MsgBox ("Workbook is open")
    Next

     
    Добавлено:

    Код:
    Sub test()
    On Error Resume Next: Err.Clear
    Set wbk = Workbooks("XXX.xls")
    If Err.Number = 9 Then
    MsgBox ("Workbook is not open")
    Else
    MsgBox ("Workbook is open")
    End If
    On Error GoTo 0
    End Sub
     

    Всего записей: 209 | Зарегистр. 01-05-2010 | Отправлено: 14:40 17-11-2012 | Исправлено: andrewkard1980, 02:51 23-11-2012
    alpopo



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Excel 2010 Проф программирование на VBA онлайн , rghost

    Всего записей: 1430 | Зарегистр. 02-08-2008 | Отправлено: 23:00 17-11-2012 | Исправлено: alpopo, 10:17 20-11-2012
    Maximus777

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    andrewkard1980

    Цитата:
    Dim oHTTP as object, sURL$  
     sURL = "http://ya.ru"  
         Set oHTTP = CreateObject("MSXML2.XMLHTTP")  
         With oHTTP  
             .Open "GET", sURL, False  
             .Send  
             sHTML = .responseText  
         End With  
         Set oHTTP = Nothing

    Если страничка в кодировке win1251, то в VBA русский текст превращается в "??????". Как с этим бороться?

    Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 14:34 18-11-2012
    komputeryuzer

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    andrewkard1980а нельзя ли проверить открыт ли нужный файл/лист на лету(одной функцией) таким способом
    ведь списки открытых файлов/листов хранятся в массиве (раз форeач)  
    неельзя ли проверить нет ли в элементах массива какого то члена.. как обычно делается в других языках программирования

    Всего записей: 762 | Зарегистр. 21-04-2010 | Отправлено: 20:27 18-11-2012
    me4me

    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    komputeryuzer

    Цитата:
    хранятся в массиве (раз форeач)  

    Блин! Просил же нормально, чтобы завязывал с олбанским? Просил.  
    Вежливо просил? Вежливо.  
    Так что тебе еще надо? Вали с этим говноязом знаешь куда, а... конфигсус!
     
    Кнопку нажал.
     
    Любой член любой коллекции можно проверить на валидность многими способами. Почти всегда это зависит от типа данных. Есть несколько специалихированных ф-ций IS[bla-bla-bla]. Самый простой (имо, стремный) способ - явное обращение к члену с последующей обработкой ошибки.  
     
    Ты в хэлп никак заглянуть-то не решаешься? Спрашиваешь такие азы и такого общего плана, что отвечая на них можно дисер написать...
     
    Последнее - прекрати сравнивать языки. Это и самому тебе вредит в освоениии нового, и других с панталыку сбивает. Не гоже это. ТЕма эта скользкая и не для данного, сугубо практического топика.

    Всего записей: 49 | Зарегистр. 15-11-2012 | Отправлено: 20:56 18-11-2012
    panda3

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    komputeryuzer
    Можно проверить одновременно, есть ли книга с нужным листом:

    Код:
    IsObject([[Книга1]Лист1!A1])

    Всего записей: 203 | Зарегистр. 06-02-2007 | Отправлено: 11:23 19-11-2012
    Открыть новую тему     Написать ответ в эту тему

    Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213

    Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Excel VBA (часть 3)


    Реклама на форуме Ru.Board.

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.B0ard
    © Ru.B0ard 2000-2024

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru