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

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



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

    Код:
    n = ActiveCell.Row


    ----------
    Мы в хорошем настроении гуляем по лесам.
    Кто обидеть нас захочет – сам получит по усам.
    Сам полу- получит по усам. Сам полу- получит по усам!

    Всего записей: 794 | Зарегистр. 13-12-2003 | Отправлено: 16:40 16-06-2006
    Anatolij2005

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Огромное спасибо!!!
    Я был близок к разгадке, но у меня был Rows.....

    Всего записей: 26 | Зарегистр. 04-10-2005 | Отправлено: 17:07 16-06-2006
    Yuk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Переношу сюда задачу от lucky_Luk из Excel FAQ foruma.
    Начало обсуждения здесь.
     
    Задача написать функцию подобную РАНГ (RANK), но чтобы не оставались пробелы в последовательности чисел.
    Например для последовательности 5 3 7 3 6 8 2
    РАНГ выдаст 4 2 6 2 5 7 1 (3 отсутствует)
    Нужно 3 2 5 2 4 6 1
     
    Функция РАНГ воспроизводится довольно просто (без последнего параметра, порядок только по увеличению):
    Код:
    Function MyRank(num As Variant, reg As Range) As Long
        Dim s As Long
        s = 1
        For Each c In reg
            If num > c.Value Then
                s = s + 1
            End If
        Next
        MyRank = s
    End Function

     
    Для заполнения пробелов необходимо знать, что происходит в остальных ячейках, что мне кажется будет серьезно тормозить эксель. Поэтому думаю, что задачу реальнее всего решить через макрос. Быстро в лоб не получилось. Какие будут идеи?  

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 02:23 18-06-2006 | Исправлено: Yuk, 09:49 18-06-2006
    Yuk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    lucky_Luk
    Мда, похоже никого задачка не заинтересовала. У меня был немного напряг со временем, но я ее все-таки добил. Код модуля ниже.
     
    Алгоритм довольно простой:
    1) Юзер выделяет область для ранжирования (1 столбец), запускает макрос. Соседний столбец  справа должен быть пустой или данные заместятся. Проверки пока нет.
    2) Данные копируются в массив
    3) Массив сортируется
    4) Удаляются дупликаты. Номер элемента в этом массиве и есть ранг соответствующей величины.
    5) Исходные данные сравниваются с массивом. Соседний столбец заполняется рангами.

    Код:
    Option Base 1
     
    Sub RankIt()
    If Selection.Columns.Count > 1 Then
        MsgBox "You selected more then 1 column", vbCritical
        Exit Sub
    End If
    'Some optimization
    Application.Calculation = xlCalculationManual
    Application.ScreenUpdating = False
     
    Dim aArray() As Variant
    Dim i As Long, c As Range
    Dim rank As Long
    Dim alen As Long
         
        'Populate the array, sort and remove duplicates
        ReDim aArray(Selection.Count)
        i = 1
        For Each c In Selection
            aArray(i) = c.Value
            i = i + 1
        Next
        SortArray aArray
        RemoveDuplicates aArray
     
        'Find values in the array
        For Each c In Selection
            rank = 1
            Do While c.Value <> aArray(rank) And rank <= UBound(aArray)
                rank = rank + 1
            Loop
            If rank > UBound(aArray) Then
                MsgBox "Something wrong with the array"
                Exit Sub
            End If
            Cells(c.Row, c.Column + 1).Value = rank
        Next
     
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    MsgBox "Done"
    End Sub
     
    Private Sub SortArray(ByRef a As Variant)
        Dim i As Long, j As Long
        Dim t As Variant
     
        'standard bubble sort loops
        For i = LBound(a) To UBound(a) - 1
            For j = i + 1 To UBound(a)
                If a(i) > a(j) Then 'change to < for descending order
                    t = a(i)
                    a(i) = a(j)
                    a(j) = t
                End If
            Next j
        Next i
    End Sub
     
    Private Sub RemoveDuplicates(ByRef a As Variant)
        Dim i As Long, j As Long
        j = 1
        Dim t() As Variant
        ReDim t(1)
        t(1) = a(1)
        For i = LBound(a) To UBound(a) - 1
            If a(i) <> a(i + 1) Then
                j = j + 1
                ReDim Preserve t(j)
                t(j) = a(i + 1)
            End If
        Next i
        ReDim a(j)
        a = t
    End Sub
     

    Комментам по улучшению/оптимизации буду рад.
    Протестировал в Excel 2000, 2003.

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 09:06 20-06-2006 | Исправлено: Yuk, 20:41 20-06-2006
    lucky_Luk

    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Yuk
    Макрос работает, спасибо. Можно ли сделать ранжирование в обратном порядке - чтобы самое большое число было на первом месте, а самое маленькое на последнем?

    Всего записей: 7100 | Зарегистр. 29-11-2004 | Отправлено: 15:15 24-06-2006
    Yuk



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

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 16:49 24-06-2006
    lucky_Luk

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

    Цитата:
    См. комент в функции сортировки.

    Скажи пожалуйста какую строку смотреть и что с ней сделать. Ну не понимаю я в VBA .

    Всего записей: 7100 | Зарегистр. 29-11-2004 | Отправлено: 17:11 24-06-2006
    Yuk



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

    Код:
    If a(i) > a(j) Then 'change to < for descending order


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

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    вопрос: как с помощью vba загрузить файл по ftp?

    Всего записей: 1 | Зарегистр. 10-04-2006 | Отправлено: 13:13 26-06-2006
    Yuk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    sleepy_frog
    Гугл рулит, как всегда:
    using vba to download file via ftp

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 18:20 26-06-2006
    mp3exchanger



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Имею: данные в первой строке и кнопку
    Необходимо: скопировать все три ячейки из первой строки и вставить их значения в последнюю пустую строку.
       
    Значения в первой строке будут меняться, но при нажатии на кнопку они всегда должны добавляться в конец. Попробовал записать макрос, вроде работает
    Код:
     
    Sub Макрос1()
        Range("A1,B1,C1").Select
        Selection.Copy
        Range("A5").Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
        Application.CutCopyMode = False
    End Sub
     
    но теперь не знаю, как мне заменить Range("A5").Select на очередную пустую ячейку.
    Уверен на 100%, что мой вопрос очень лёгкий для того, кто разбирается в VBA. Подскажите, пожалуйста.

    Всего записей: 518 | Зарегистр. 24-02-2003 | Отправлено: 22:49 26-06-2006 | Исправлено: mp3exchanger, 22:50 26-06-2006
    Yuk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    mp3exchanger
    Можно так:
    Код:
    Cells(Range("A5").End(xlDown).Row + 1, 1).Select

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



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Yuk вставив твою строку в свой макрос получил 1004 ошибку... а ты уверен, что ссылка на A5 в твоей строке нужна? Ведь мне понадобится копировать и в A7, A8, A9 и т.д.

    Всего записей: 518 | Зарегистр. 24-02-2003 | Отправлено: 23:20 26-06-2006
    Yuk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    mp3exchanger
    Извиняюсь, недосмотрел. Ошибка выходит вначале, когда А5 или А6 пустые.
    Один способ:
    Код:
        If Range("A5").Value = "" Then
            Range("A5").Select
        ElseIf Range("A6").Value = "" Then
            Range("A6").Select
        Else
            Cells(Range("A5").End(xlDown).Row + 1, 1).Select
        End If
    Range("A5") нужна, чтобы выбрать область у которой искать границу.
    Другой способ - сохранить номер последней строки в какую-нибудь ячейку и читать его при следующем запуске макроса.

    Код:
        If Range("A2").Value = "" Then
            Range("A2").Value = 5
        End If
        Cells(Range("A2").Value, 1).Select
        Range("A2").Value = Range("A2").Value + 1

     
     
    Добавлено:
    Еще один способ. Строка добавляется в конец используемой области.
    Код:
    Cells(ActiveSheet.UsedRange.Rows.Count + 1, 1).Select

    Кстати, 2-ю и 3-ю строки кода можно объединить, а также не использовать несколько областей для копирования, если не нужно.
    Код:
    Range("A1:C1").Copy


    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 23:51 26-06-2006
    mp3exchanger



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Yuk
    Третий способ меня вполне устроил. Спасибо большое за помощь

    Всего записей: 518 | Зарегистр. 24-02-2003 | Отправлено: 01:26 27-06-2006
    RobinStone

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

    Всего записей: 14 | Зарегистр. 27-06-2006 | Отправлено: 10:53 27-06-2006
    0na

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Здравствуйте!
    Помогите, плз.
    Задача такая:
    есть таблицы в Excel их надо вставить в Power Point (как рисунок).  
    Просто скопировать и вставить не пойдет, надо автоматом - запустил макрос и таблицы в презентации.
    думала просто запишу свои действия в макрос и все, но...
    вот, что я делала:
    1.  есть Excel файл без связей, только значения.
    2.  задаю область печати (ту часть таблицы которая нужна для презентации)
    начала записывать макрос
    3.  выделяю и копирую Область_печати (Ctrl+G; Ctrl+C)
    4. вставляю в Power Point  
    завершила запись макроса.
     в результате в макрос записался только пункт 3.
    Если записывать макрос из под Power Point, то вставляется в презентацию то, что находится в буфере.
     
    Посоветуйте как решить эту задачу.
    Очень нужна литература по созданию макросов - подскажите где скачать. (порылась на форуме ссылки не живые, может что-нибудь свеженькое)
     
    Заранее благодарю!
     

    Всего записей: 1 | Зарегистр. 27-06-2006 | Отправлено: 12:11 27-06-2006
    KrayMay

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    2Ona:
    задача сложная. следует читать про оле-объекты. помоему по другому никак.
    макрос не записывается,т.к. пишет только то что делается в Excel'e.
    работать надо в направлении управления PowerPoint из Excel.

    Всего записей: 8 | Зарегистр. 06-03-2005 | Отправлено: 14:20 27-06-2006
    Yuk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    RobinStone
    Скопируй в  код листа (в VBA редакторе):

    Код:
    Private Sub Worksheet_Change(ByVal Target As Range)
        Application.EnableEvents = False
        If Target.Column = 2 Then
            Cells(Target.Row, Target.Column - 1).Value = _
            Cells(Target.Row, Target.Column - 1).Value + Target.Value
            Target.Clear
        End If
        Application.EnableEvents = True
    End Sub

     
    Добавлено:
    0na
    Напоминаю в очередной раз, прежде чам задать вопрос не забываем про Гугл:
    http://www.ozgrid.com/forum/showthread.php?t=25439
    http://www.mahipalreddy.com/vba.htm#pptable
    А также здесь

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 18:44 27-06-2006
    Igor83o

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Помогите ктонить! Подскажите пожалуйсто как работать с двоичными данными? Данные хранятся в базе я саздаю запрос а там такая вещ <BLOB Binary> и что с ней делать ненаю и как выковырять от туда нужные мне данные ?

    Всего записей: 1 | Зарегистр. 06-06-2006 | Отправлено: 21:07 29-06-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.Board
    © Ru.Board 2000-2018

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru

    Рейтинг.ru