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

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

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

ShIvADeSt (23-04-2007 01:59): http://forum.ru-board.com/topic.cgi?forum=33&topic=8273  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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

   

RUSmafia



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

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

 
Обратите внимание, этот топик для помощи в изучении и использовании VBA. Посему запросы типа "Напишите мне такой-то макрос, я VBA не знаю и знать не хочу" не приветствуются.
Древняя мудрость: "Накорми голодного рыбой и он погибнет, научи его ловить рыбу и ты спасешь его."(R)
 
Информация общего характера:
  • Список соответствия имен функций в английской и русской версиях Excel
  • Описание Microsoft Excel File Format
     
    Рекомендации:
    Если у Вас есть проблема, не решаемая стандартными средствами 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.
     
    Родственные топики:
  • Вопросы по работе с MS Excel - Excel FAQ - часть 1, часть 2
  • Технические проблемы с MS Office 2003 или Office XP.
  • Word VBA все вопросы по Word VBA туда
  • Access все вопросы по программированию в Access туда
  • Книжульки по VBA - книги по программированию с использованием VBA
     
    Конкретные вопросы:
    Форма-заставка
    Как запустить макрос при изменении положения курсора или значения ячейки
  • Пример 1
  • Пример 2
  • Пример 3 (проверка области)
  • Пример 4
  • Пример 5
    Зацикливание в функции Change или SelectionChange
     
    Ранжирование без пробелов (макрос включает функции сортировки массива и удаления дубликатов, работает и в Excel 2007)
  • под Office 97
     
    Добавление в главное меню своего пункта, ассоциированного с макросом
    Создание ярлыка на рабочем столе
    Снятие защиты листа при забытом пароле
    Смена раскладки клавиатуры
    Скролл формы колесом прокрутки мыши
    Оптимизация кода по быстродействию использованием массивов

  • Всего записей: 556 | Зарегистр. 31-07-2002 | Отправлено: 21:40 14-10-2004 | Исправлено: lucky_Luk, 20:44 13-04-2007
    LevT



    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AndVGri
     
    Большое спасибо - но я надеялся, что найдется какая-нибудь функция, которая вытаскивает имена  из неоткрытых книг (вернее, даже результат разыменования, и даже его проперти). Есть ведь функции, которые берут из неоткрытых книг данные, та же TRANSPOSE. Почему бы не?..
     

    Всего записей: 17149 | Зарегистр. 14-10-2001 | Отправлено: 17:10 15-03-2007 | Исправлено: LevT, 18:12 15-03-2007
    hackman



    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Подскажите как обойти ошибку деление на ноль. Так как макрос умирает на ошибке Type Mismath у ячейки где есть ошибка ДЕЛ/0.

    Код:
     
    Sub rent_check_po_prod()
     
    For i = 1 To 256
    If Cells(1, i).Value = "vsgvl" Then vsgvl = i
    Next i
     
    For i = 5 To vsgvl - 1
    If Cells(16, i).Value > 1.5 Then MsgBox "Ðåíòàáåëüí³ñòü ï³äîçð³ëî âåëèêà!" & (Cells(4, i))
    If Cells(16, i).Value < -0.6 Then MsgBox "&ETH;&aring;&iacute;&ograve;&agrave;&aacute;&aring;&euml;&uuml;&iacute;&sup3;&ntilde;&ograve;&uuml; &iuml;&sup3;&auml;&icirc;&ccedil;&eth;&sup3;&euml;&icirc; &igrave;&agrave;&euml;&agrave;!" & (Cells(4, i))
     
    Next i
     
    End Sub
     

     

    Всего записей: 185 | Зарегистр. 22-09-2003 | Отправлено: 17:49 15-03-2007
    Olive77

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Sub rent_check_po_prod()  
     
    For i = 1 To 256  
       If Cells(1, i).Value = "vsgvl" Then vsgvl = i  
    Next i  
     
    For i = 5 To vsgvl - 1  
       If Not Application.WorksheetFunction.IsErr(Cells(16, i).Value) Then
          If Cells(16, i).Value > 1.5 Then  Msgbox "1"  
          If Cells(16, i).Value < -0.6 Then  MsgBox "2"  
       End If
    Next i  
     
    End Sub  

    Всего записей: 1271 | Зарегистр. 26-12-2002 | Отправлено: 18:00 15-03-2007
    AndVGri

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    hackman
     
    Ну, так что мешает вставить проверку
     
    If IsNumeric(Cells(16, i).Value Then
        If Cells(16, i).Value > 1.5 Then Msgbox ...
        If Cells(16, i).VAlue < -0.6 Then Msgbox ...
    End If
     
    Добавлено:
    Olive77

    Цитата:
    If Not Application.WorksheetFunction.IsErr(Cells(16, i).Value) Then  

    А если Cells(16, i).Value будет "Я не число"

    Всего записей: 750 | Зарегистр. 14-12-2005 | Отправлено: 18:02 15-03-2007
    Olive77

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

    Всего записей: 1271 | Зарегистр. 26-12-2002 | Отправлено: 18:08 15-03-2007
    aks_sv

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Помогите решить такую задачу. Отсканировал таблицу с большим числом строк и при передачи в Excel получилась какая-то ерунда.
    Например в ячейке было значение: 1 483,05
                                                              5,000
    а при передаче в Excel получилось: 1 483,05 5,000
                                                    или: 55,08
                                                           10,000
                                         получилось: 55,08 10,000  
    И таких значений великое множество. Может кто поможет с макросом?

    Всего записей: 109 | Зарегистр. 18-12-2006 | Отправлено: 20:43 15-03-2007
    LevT



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

    aks_sv
     
    Если ты не спец по анализу подобных данных - то тебе поможет только повторное распознавание с тщательной настройкой регионов файнридером
     
    Любым автоматическим макросом сделаешь только хуже. Если решишься на макрос - делай в два этапа, полуавтоматом. Первый макрос красит все интересные места в попугайский цвет и шрифт, второй правит только там, где покрашено, и где при том [не] стоит ручная отметка-подтверждение (вариант такой отметки - возврат к обычному форматированию).
     
    Когда-то занимался подобными вещами в Ворде и Акцесе.
     

    Всего записей: 17149 | Зарегистр. 14-10-2001 | Отправлено: 22:32 15-03-2007 | Исправлено: LevT, 22:35 15-03-2007
    aks_sv

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    LevT
    Я понял, как это получилось:  
    значения: 55,08  
                    10,000  
    оказались в одной ячейке потому, что при распозновании в FR в другом столбце напротив 55,08 значение присутствует, а напротив 10,000 нет. В Excel в формате ячейки не стоял перенос по словам, а по ширине значения помещались, поэтому и получилось: 55,08 10,000.
    Вопрос в другом: как разделить по ячейкам эти значения?  

    Всего записей: 109 | Зарегистр. 18-12-2006 | Отправлено: 07:45 16-03-2007
    LevT



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

    В экселе - так же как и в ворде, и в акцессовском фильтре импорта - существует команда разбиения текста по столбцам. Кажется, тебе туда.

    Всего записей: 17149 | Зарегистр. 14-10-2001 | Отправлено: 10:52 16-03-2007
    SERGE_BLIZNUK

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    aks_sv
    вот макрос, который находит такие ячейки, разделяет на два числа и записывает в ячейки справа от обработанной. Доработав пример Вы получите то, что Вам нужно:

    Код:
     
    Sub Asplit()
    Set w1 = ActiveWorkbook.ActiveSheet
    MyCol = 2 ' обрабатываем столбец 2
    Row1 = w1.UsedRange.Row
    Row2 = Row1 + w1.UsedRange.Rows.Count - 1
     
    For i = Row1 To Row2
      MyType = TypeName(w1.Cells(i, 2).Value)
      If (MyType = "String") Then
        s = w1.Cells(i, MyCol).Value
        posSpace = InStr(Trim(s), " ")
        If posSpace > 0 Then
          s1 = Trim(Mid(s, 1, posSpace))
          s2 = Trim(Mid(s, posSpace + 1))
          d1 = Val(s1)
          d2 = Val(s2)
          If (d1 <> 0) And (d2 <> 0) Then
             ' вот здесь обработка найденных значений!
             w1.Cells(i, MyCol+1).Value = d1
             w1.Cells(i, MyCol+2).Value = d2
          End If
        End If
      End If
    Next i
    End Sub
     

     
    удачи.

    Всего записей: 2014 | Зарегистр. 12-09-2002 | Отправлено: 10:52 16-03-2007
    The okk



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Экспериментировал с нестандартным использованием UDF-ов. В них можно напихать все, что угодно - можно вызвать формулой MsgBox, менять комменты ячеек... в общем, все... кроме действий, вызывающих рекалькуляцию. Т.е. все попытки запихать что-нибудь типа Cell.Value = 100 или Cell.FormulaR1C1 = "=A5 + A1" между Function и End Function успехом не увенчаются. Причем, функция вылетит на этих строках без сообщения об ошибке.

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 12:09 16-03-2007
    aks_sv

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    SERGE_BLIZNUK
     
    Почему-то при запуске макроса выделяется w1= и выскакивает окошко:  
    Compile error: Variable not defined

    Всего записей: 109 | Зарегистр. 18-12-2006 | Отправлено: 13:11 16-03-2007
    AndVGri

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    aks_sv
     
    Определите переменные, используемые процедурой
    Sub Asplit()
        Dim w1 As Worksheet
        Dim MyCol As Long, Row1 As Long, Row2 As Long
        Dim MyType As String, posSpace As Long
        Dim d1 As Double, d2 As Double
        Dim s1 As String, s2 As String
    ...
    ...
    End Sub
     

    Всего записей: 750 | Зарегистр. 14-12-2005 | Отправлено: 13:19 16-03-2007
    SERGE_BLIZNUK

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AndVGri
    Цитата:
    Определите переменные, используемые процедурой  

    век живи — век учись...
     
     
    aks_sv

    Цитата:
    Compile error: Variable not defined

    или можно так Alt-F11 / Tools /  Options / Editor (Require Variable Declaration - убрать галочку)
     
    AndVGri - спасибо за науку. Теперь я понял, зачем Вы всегда описываете переменные!
     

    Всего записей: 2014 | Зарегистр. 12-09-2002 | Отправлено: 14:15 16-03-2007
    aks_sv

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    SERGE_BLIZNUK
    AndVGri
    Большое спасибо!

    Всего записей: 109 | Зарегистр. 18-12-2006 | Отправлено: 14:25 16-03-2007
    Malinoff

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Привет! Подскажите пожайлуста чайнику! При сохранении файла xls в csv как положено через пункт меню файл\сохранить как... сохранение происходит нормально с записью значений в ячейки, а при записи данной операции в макрос исходный файл получается с разделителями запятыми и все в одну строчку.... подскажите как поправить такой макрос для нормального сохранения...

    Всего записей: 3 | Зарегистр. 16-03-2007 | Отправлено: 16:58 16-03-2007
    AndVGri

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Malinoff
     
    Так как с вопросом привести код? Вы сохраняете в CSV это и есть "значения разделённые запятыми" (comma separated values) и, следовательно, никаких ячеек данный формат не содержит.
    Чтобы понять, почему в макросе у Вас данные сохраняются в одну строку (если Вы только не сохраняете одну строку данных), нужно поглядеть на Ваш код, на предмет ошибки.

    Всего записей: 750 | Зарегистр. 14-12-2005 | Отправлено: 17:12 16-03-2007
    Malinoff

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AndVGri
    Код записывается автоматически когда я последовательно выполняю действия руками, но итог сохранения руками и программно разный, при открытии полученных вайлов Excelем очевидна разница...
     
    Добавлено:
    Я имею ввиду сохранение небольших таблиц, руками csv получается практически такой же только все форматы убираются, а программно - как положено с разделителями запятыми... так вот мне нужно что бы программно получалось в точности как руками

    Всего записей: 3 | Зарегистр. 16-03-2007 | Отправлено: 17:25 16-03-2007
    AndVGri

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Malinoff
    Из блокнота, сохранённое "руками"
    1,2,3
    6,5,4
    q,w,e
     
     
    Из блокнота, сохранённое макросом ActiveWorkbook.SaveAs Filename:="D:\Книга2.csv", FileFormat:=xlCSV, CreateBackup:=False
    1,2,3
    6,5,4
    q,w,e
     
    В чём разница?

    Всего записей: 750 | Зарегистр. 14-12-2005 | Отправлено: 18:04 16-03-2007
    robinLib

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Доброе время суток! Подскажите пожалуйста как при нажатии на кнопку перемстить курсор на ячейку но так, чтобы она оказалась в левом верхнем углу. Просто Range("F46").select переводит курсор на ячейку но она может оказаться где угодно, а мне необходимо чтобы именно в верхнем левом углу.

    Всего записей: 138 | Зарегистр. 24-07-2005 | Отправлено: 14:12 17-03-2007
       

    Страницы: 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

    Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Excel VBA
    ShIvADeSt (23-04-2007 01:59): http://forum.ru-board.com/topic.cgi?forum=33&topic=8273


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

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

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru