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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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
    zporuchik



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Никто не подскажет как можно экселевский макрос запустить в Аксесе?
    Сам макрос

    Всего записей: 2131 | Зарегистр. 17-03-2005 | Отправлено: 11:30 17-07-2006
    Yuk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    zporuchik
    Похоже, ты пытаешься использовать экселевскую объектную модель (Cells) в аксессе. Не получится. Надо макрос переписывать. Функция Replace имеет такой же синтаксис, а вот объект должен быть другим. Зависит от того, что ты хочешь делать. Но это тема уже для другого форума.
    Если же ты хочешь переконвертировать экселевский файл из аксесса, это в принципе можно.

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 17:35 17-07-2006
    Denis_Kokyev



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

    Цитата:
    выдели в исходной странице столбец с числами, выбери формат ячейки, поставь числовой и количество знаков после
    запятой побольше (ну хотя бы два знака после запятой). наверняка увидишь дробные части... )

    Я же с математической точки зрения, и пример ведь привёл. Выставите вы
    количество  знаков  побольше  - но ведь от суммирования целых чисел не
    могут получаться дробные, и при суммировании 2 + 2 не может получаться
    число 3.5!
     

    Цитата:
    Это свойство End. Для всей строчки используй Selection.EntireRow.

    Я опять не так понял что-то:

    Код:
    Range(Selection.EntireRow(xlToLeft), Selection.EntireRow(xlToRight)).Copy

    Не работает - ошибку выдаёт.
     

    Цитата:
    А вот откуда начинать суммирование ты решил? Всегда с первой строчки? Или с End(xlUp)?

    Думаю - пока с первой строчки:

    То бишь в ячейке F1 должна подсчитываться сумма E1:E бесконечность.
     


    ----------
    Можно ответить на любой вопрос, если вопрос задан правильно.
    Платон

    Всего записей: 1074 | Зарегистр. 24-02-2003 | Отправлено: 18:17 17-07-2006
    Yuk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Denis_Kokyev
    SERGE_BLIZNUK имел ввиду, что если ты видишь целое число, это не значит, что у тебя в ячейке целое число. Прежде чем грешить на макрос, просуммируй прямо в листе через функцию СУММ.
     

    Цитата:
    Это свойство End. Для всей строчки используй Selection.EntireRow.

    Попробуй в листе понажимать End, затем стрелку вправо, или End влево. Именно это и делает End в макросе, то есть возвращает ячейку, на которую ты попал, нажимая на End-влево (xlToLeft) или End-вправо (xlToRight). Есть также xlUp и xpDown. Это все экселевские константы направления, которые в свойству Entire Row не имеют ни какого отношения.
    Тебе нужно
    Код:
    Selection.EntireRow.Copy

    Вообще, если встречаешь какую-либп функцию, зайди в хелп и почитай о ней. Узнаешь много интересного. Там и примеры часто есть.
     

    Цитата:
    То бишь в ячейке F1 должна подсчитываться сумма E1:E бесконечность.

    Например,
    Код:
    Range("F1").Value=WorksheetFunction.Sum(Range("E:E"))

     

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 19:01 17-07-2006
    Denis_Kokyev



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

    Цитата:
    Прежде чем грешить на макрос, просуммируй прямо в листе через функцию СУММ.

    Забыл написать. Как раз-таки СУММ выдает нормальное значение.
     

    Цитата:
    Вообще, если встречаешь какую-либп функцию, зайди в хелп и почитай о ней. Узнаешь много интересного.

    Это первое, что я сделал. Но не нашёл. По всякому пытался - но в help,
    по поиску этой функции, мне возвращает - "поиск не дал результатов".
     

    Цитата:
    Range("F1").Value=WorksheetFunction.Sum(Range("E:E"))  

    Спасибо огромное - этот код помог - считает нормально!
     
    Добавлено:
    Денчик Тупой, причём очень! Я понял, откуда вылезают дроби, и что Вы
    имели ввиду, а я мучался! Спасибо Вам!


    ----------
    Можно ответить на любой вопрос, если вопрос задан правильно.
    Платон

    Всего записей: 1074 | Зарегистр. 24-02-2003 | Отправлено: 21:14 17-07-2006 | Исправлено: Denis_Kokyev, 22:20 17-07-2006
    Yuk



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

    Цитата:
    "поиск не дал результатов"

    Иногда помогает "Просмотр объектов" (F2). А также гугл.
     

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 00:10 18-07-2006
    DeadVillage



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Доброго времени суток.
    Как перегонять выбранные ячейки в одномерный массив?
    Вот собсна и весь вопрос.

    Всего записей: 652 | Зарегистр. 05-12-2003 | Отправлено: 06:43 21-07-2006
    Yuk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    DeadVillage
    Посмотри, как это сделано здесь:
    http://forum.ru-board.com/topic.cgi?forum=33&topic=3961&start=420#5
    Основные моменты:

    Код:
     Option Base 1
    ...
        Dim aArray() As Variant 'динамический массив
        ...
        ReDim aArray(Selection.Count) 'выделяем размер
        i = 1
        For Each c In Selection
            aArray(i) = c.Value
            i = i + 1
        Next
        ...  


    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 07:40 21-07-2006
    agrippa

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Как сделать из двух строк одну в Exel? Надо,чтобы верхняя строка становилась слева от нижней...
    Например:
       111111111111
       222222222222
       333333333333
       444444444444
     
     
     
      111111111111 - эту строку надопоставить перед строкой 22222222222
      111111111111222222222222 - вот что должно получиться
      333333333333 - эту поставить перед строкой 44444444444
      3333333333334444444444444 - вот что должно получиться здесь  
                                 и т.д.
    И при этом не должно быть пробелов между между строками...
    Помогите плз!!!
    Это очень срочно!!!
     

    Всего записей: 17 | Зарегистр. 22-07-2006 | Отправлено: 10:36 22-07-2006
    Yuk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    agrippa
    Обязательно нужен макрос?

    Код:
    =IF(MOD(ROW(A1),2)<>0,A1&A2,"")


    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 19:01 23-07-2006
    agrippa

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Спасибо вам большое, Yuk. Век вас не забуду. Вы мне очень помогли.

    Всего записей: 17 | Зарегистр. 22-07-2006 | Отправлено: 19:38 23-07-2006
    zQuatroz

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Здравствуйте и Доброго Вам времени суток!
    Есть трабл ПОМОГИТЕ плз. нужно в VBA (Excel) написать записную книжку:
    В ней должно содержаться 3 раздела: заметки, дни рождения, список запланированных дел. При запуске приложения должно выскакивать напоминание о делах которые нужно выполнить сегодня(согласно системной дате). В разделе "Дни рожения" должна вводится дата и за сколько дней до нее напомнить.  
    Пожалуйста помогите с написанием или укажите ссылки на примеры.
    Плз Помогите, а то меня повесят!!! Заранее благодарен!

    Всего записей: 31 | Зарегистр. 05-12-2005 | Отправлено: 20:00 23-07-2006
    rebroff

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Столкнулся с необходимостью освоения VBA. До этого писал исключительно на Оbject Paskal и C++. Вопрос, может не совсем по теме: Нужно сохранить полностью статью "Первые шаги с vba excel", т.е. с функционированием иерархического оглавления. Помогите, пожалуйста, кто в курсе. Может у кого есть ссылки на дельные статьи и учебники, - буду очень признателен. Заранее спасибо.

    Всего записей: 2 | Зарегистр. 24-07-2006 | Отправлено: 12:52 24-07-2006
    unfreqient



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    rebroff
    Вот ссылочка: _http://www.citforum.ru/programming/digest/excel_vba.shtml

    Всего записей: 104 | Зарегистр. 20-07-2006 | Отправлено: 14:08 24-07-2006
    agrippa

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

    Цитата:
    agrippa  
    Обязательно нужен макрос?  
     
    Код:=IF(MOD(ROW(A1),2)<>0,A1&A2,"")  

     
    Извини,Yuk, это формула? А как мне её использовать? Она не хочет работать... Может есть другое решение? Пожалуйста, помоги мне снова...
     
    Мне нужно чтобы прога делала эту операцию(из предыдущего вопроса) только со строками вида
    111111111111  
    222222222222  
    333333333333  
    444444444444,
     
    а пустые и те,в которых текст - пропускала и искала строки этого вида  
    111111111111  
    222222222222  
    333333333333  
    444444444444...  
     
     

    Всего записей: 17 | Зарегистр. 22-07-2006 | Отправлено: 08:08 25-07-2006
    RedPromo



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    zQuatroz
    Интересный подход а эксел такое писать, я предложил посмотреть в сторону Access, но можно поизвращатся и в Exel. Можно сделать так создать 3 скрытых листа и использовать их как базу данных. А при открытии на трех видимых листах с красивым оформлением и названиями (дни рож.. и тд.) (кстати их можно заблокировать от редактирования о приопределить нажатия на ентер и прочие клавиши.) выводить заметки и днирождения также можно толбар свой прикрутить. Кнопка Добавить заметку, добавить день рожденья. А если еще использовать ActivX компоненты Grid нормальный то вобще фантазий нет предела.
    Пирмеров нет, но если что нужно более детально по реализации подскажу пиши.
     
    Добавлено:
    agrippa
    Вот тебе примерно такая программка  
     

    Цитата:
     
    Sub SeekStr()
        Dim RangShet As Range
        Dim I As Integer
        Dim PreStr As String
         
        Set RangShet = Application.Worksheets("Лист1").UsedRange //Выбираем используемую область на странице
         
        I = 0
        For I = 1 To RangShet.Rows.Count // делаем обход ее по строкам
            Set rw = RangShet.Rows(I)
            PreStr = rw.Cells(1, 1).Value   //Исходим что данная строка у тебя в первой колонке
            If PreStr <> "" Then               // здесь условия на строку если то что нужно тогда все в порядке
                rw.Delete                         //Значение стороки запомнили и удалили строку
                Set rw = RangShet.Rows(I) //Строки сместились и теперь уже под таки же индексом но уж новая строка та что была ниже
                PreStr = PreStr + rw.Cells(1, 1).Value  
                rw.Cells(1, 1).Value = PreStr // ну теперь конкатенируем строки
            End If
        Next
    End Sub
     

    Всего записей: 558 | Зарегистр. 05-04-2006 | Отправлено: 15:18 25-07-2006
    Yuk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    agrippa
    Забудь про формулу.
    Вот тебе макрос:

    Код:
    Sub MergeCells()
        first = True
        rownum = 1
        For Each c In Selection
            If IsNumeric(c) And Not IsEmpty(c) Then
                If first Then
                    tmpstr = CStr(c)
                    first = False
                Else
                    Cells(rownum, c.Column + 1) = Chr(39) & tmpstr & CStr(c)
                    first = True
                    rownum = rownum + 1
                End If
            End If
        Next
    End Sub

    Скопируй код в новый модуль, выдели область ячеек и запусти макрос. Объединенные значения вставятся в соседней колонке (заместив там старые значения).
    Небольшая проблема в том, что полученное число 111111111111222222222222 превышает максимальное целое в экслеле и может быть показано только как строка или в виде 1.11111111111222E+23. Если нужно числовое представление, убери Chr(39) & в коде.

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 16:36 25-07-2006
    agrippa

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Спасибо большое. Еще вопрос: а можно сделать так,чтобы макрос создавал еще один лист сам,переносил туда еще не объединенные строки и рядом с ними(через столбец) поставил уже объединенные??? И чтобы после обрыва таблицы(когда первый ряд объединяемых строк заканчивался) и когда будет объединять строки другой таблицы,создал новый лист и сделал тоже,что и с первым? Извините меня,что гружу,но мне именно это надо... Заранее,большое спасибо!

    Всего записей: 17 | Зарегистр. 22-07-2006 | Отправлено: 19:27 25-07-2006
    Yuk



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

    Цитата:
    а можно сделать так,чтобы макрос создавал еще один лист сам,переносил туда еще не объединенные строки и рядом с ними(через столбец) поставил уже объединенные??? И чтобы после обрыва таблицы(когда первый ряд объединяемых строк заканчивался) и когда будет объединять строки другой таблицы,создал новый лист и сделал тоже,что и с первым?

    Несколько раз перечитал, но так и не понял задачу. Еще раз, пожалуйста, с примерами (что на входе и что надо на выходе), названиями листов и конкретными адресами. Хотелось бы также знать, для чего это все надо.
     
    Кстати, ты пробовал хоть один из предложенных макросов, или RedPromo или мой? Какой больше подходит?
     

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 20:10 25-07-2006
    agrippa

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
        Лист1        |                    Лист2                                            |              Лист3
    111111111111 |  111111111111   111111111111222222222222    | 555555555555   555...666
    222222222222 |  222222222222   333333333333444444444444    | 666666666666   777...888
    333333333333 |  333333333333                                                 | 777777777777
    444444444444 |  444444444444                                                 | 888888888888
                          |                                                                        |
                          |                                                                        |
                          |                                                                        |
    555555555555 |                                                                        |
    666666666666 |                                                                        |
    777777777777 |                                                                        |
    888888888888 |                                                                        |
                          |                                                                        |
     
    Мне это по учёбе надо...  
     
    Макрос RedPromo выдаёт ошибку... Твой макрос,уважаемый Yuk, почему-то у меня вообще ничего не делает...

    Всего записей: 17 | Зарегистр. 22-07-2006 | Отправлено: 21:25 25-07-2006
       

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