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

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

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

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

   

ShIvADeSt



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

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

 
Обратите внимание, этот топик для помощи в изучении и использовании VBA. Посему запросы типа "Напишите мне такой-то макрос, я VBA не знаю и знать не хочу" не приветствуются.
Древняя мудрость: "Накорми голодного рыбой и он погибнет, научи его ловить рыбу и ты спасешь его."(R)
 
Предыдущие ветки топика: Часть 1
 
Информация общего характера:
  • Список соответствия имен функций в английской и русской версиях 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

  • Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 01:58 23-04-2007 | Исправлено: JekG, 22:32 10-01-2010
    SAS888

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

    Цитата:
    При больших массивах ReDim Preserve займет много времени. Нерационально переписывать массив на каждом значении

    Это все равно будет гораздо быстрее, чем использовать несколько циклов работы с ячейками листа Excel.
     
    Добавлено:
    DenisSmo
    Решение Вашей задачи достаточно простое, если имя листа, содержащего в ячейке "A1" значение для добавления к имени файла во всех файлах одинаковое и известное (в примере это "Литст1"). Только в этом случае можно получить значение ячейки не открывая файл (либо при помощи ссылки, либо макросом XLM). Если устраивает, то следующий код переименует все файлы с расширением ".xls" согласно Вашему требованию.

    Код:
    Sub Main()
        Dim FPath As String, FName As String, x As String
        FPath = ThisWorkbook.path & Application.PathSeparator: FName = Dir(FPath & "*.xls")
        Do While FName <> ""
            If FName <> ThisWorkbook.Name Then
                x = ExecuteExcel4Macro("'" & FPath & "[" & FName & "]Лист1'!" & Range([A1].Address).Range("A1").Address(, , xlR1C1))
                Name FPath & FName As FPath & Left(FName, Len(FName) - 4) & x & ".xls"
            End If
            FName = Dir
        Loop
    End Sub

    Всего записей: 398 | Зарегистр. 31-10-2007 | Отправлено: 12:04 04-06-2009 | Исправлено: SAS888, 12:29 04-06-2009
    filmax



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Как скопировать группу ячеек, например A1:D10 из макроса Excel, в созданный этим макросом документ Word, с помощью selection.copy, чтобы не было таблицы.
    То есть неформатированный текст.

    Всего записей: 220 | Зарегистр. 12-10-2002 | Отправлено: 15:52 04-06-2009
    dneprcomp



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    SAS888
    Но ведь это все равно будет гораздо медленнее, если использовать ReDim Preserve на каждом шаге. Чем могло бы быть

    Всего записей: 3920 | Зарегистр. 31-03-2002 | Отправлено: 20:32 04-06-2009
    SAS888

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    dneprcomp
     
    Цитата:
    Но ведь это все равно будет гораздо медленнее, если использовать ReDim Preserve на каждом шаге

    Согласен. Смотря сколько этих шагов. Вариантов решения очень много. И  какой из них наиболее рациональный, зависит от множества факторов.
    Так, например, можно в цикле получить коллекцию уникальных значений, а затем, уже зная количество элементов, определить размерность массива и вторым циклом "загнать" в него коллекцию.

    Всего записей: 398 | Зарегистр. 31-10-2007 | Отправлено: 06:09 05-06-2009
    babiych

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Помогите начинающему  новичку    пожалуйста,  возникла проблема,  
    Есть столбец в excel с последовательностью  + и -
    -
    -
    +
    -
    -
    -
    +
    +
    +
    Написал на VBA простой  алгоритм который подсчитывает соответственно количество + и - в последовательности то есть такой результат выдает в соседней таблице  
    -   1
    -   2
    +  1
    -   1
    -   2
    -   3
    +  1
    +  2
    +  3
     Помогите не как не могу понять, как дополнить алгоритм, чтобы в результате подсчета данные  записывались таки образом
    -    
    -   2
    +  1
    -    
    -    
    -   3
    +  
    +  
    +  3
    Т.е пропускались промежуточные вычисления  и выводился только результат , а то приходится в ручную убирать лишнее
     
    While (a = True)
      If ActiveCell.Value = "+" Then
      Set c = Range(ActiveCell.Address)
      c.Select
      flag = True
      mn = 0
      pl = pl + 1
      Range("P1").Value = gpl
      ActiveCell.Offset(0, 1).Value = pl
      End If
      If ActiveCell.Value = "-" Then
       flag = False
       pl = 0
       mn = mn + 1
       ActiveCell.Offset(0, 1).Value = mn
         End If
    If ActiveCell.Value = ""   Then a = False    
     Wend
         
       
     

    Всего записей: 2 | Зарегистр. 03-04-2007 | Отправлено: 17:08 05-06-2009
    dneprcomp



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

    Цитата:
    Так, например, можно в цикле получить коллекцию уникальных значений, а затем, уже зная количество элементов, определить размерность массива и вторым циклом "загнать" в него коллекцию.

    А вот это решение и будет скорее всего оптимальным

    Всего записей: 3920 | Зарегистр. 31-03-2002 | Отправлено: 03:30 06-06-2009
    SAS888

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    babiych
    Выделите требуемый диапазон в столбце (где находятся "+" и "-") и выполните макрос:

    Код:
    Sub Num()
        Dim i As Long, Cell As Range: Application.ScreenUpdating = False: i = 1
        For Each Cell In Selection
            If Cell = Cell.Offset(1) Then
                i = i + 1
            Else: Cell.Next = i: i = 1
            End If
        Next
    End Sub

    Если диапазон заранее известен, или его можно определить, то можно обойтись и без выделения.

    Всего записей: 398 | Зарегистр. 31-10-2007 | Отправлено: 07:32 09-06-2009 | Исправлено: SAS888, 07:45 09-06-2009
    LukeMurmansk

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Добрый день!
     
    Help, please
     
    ОЧЕНЬ нужно решить задачку по подсчету количества определенного символа. В качестве функции этот код работает, т.е. выделив диалазон запускаю функцию, через InputBox говорю что искать и в MsgBox вывожу результат. Все здорово.
    Но телерь понадобилось сделать процедуру, чтобы можно было в какой-нибудь ячейке Excel написать формулу вроде такой:
     
    =CharCountParam("a",a1:b5)  
     
    и в получить количество букв "а" в этом диапазоне. Но в ячейке пишется #ЗНАЧЕН!
    Думаю что я не корректно использую Range, но не могу понять что именно не так. HELP!
     
    ----------------------------------------------------------------------------------------
    Public Function CharCountParam(Fchar As String, Rng As Range) As Long
     
    Dim lngPosition, lngStartPosition, lngCount, TotalCount As Long
    Dim rCell As Range
     
    If Fchar = "" Then End
     
    TotalCount = 0
    lngPosition = 0 - Len(Fchar)
    lngCount = -1
           
    For Each rCell In Rng
        Do
            lngPosition = InStr(lngPosition + Len(Fchar), rCell, Fchar)
            lngCount = lngCount + 1
            Loop Until lngPosition = 0
    TotalCount = TotalCount + lngCount
    lngCount = -1
    lngPosition = 0 - Len(Fchar)
    Next rCell
     
    CharCountParam = TotalCount
     
    End Function
    ------------------------------------------------------------------------------------------

    Всего записей: 2 | Зарегистр. 10-06-2009 | Отправлено: 11:33 10-06-2009
    SAS888

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

    Код:
    Function CharCountParam(txt As String, rng As Range) As Long
        For Each Cell In rng
            If Cell <> "" Then CharCountParam = CharCountParam + UBound(Split(Cell, txt))
        Next
    End Function


    Всего записей: 398 | Зарегистр. 31-10-2007 | Отправлено: 13:20 10-06-2009
    LukeMurmansk

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

    Всего записей: 2 | Зарегистр. 10-06-2009 | Отправлено: 15:40 10-06-2009
    shark478Vagon



    Newbie
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    помогите разобраться в задаче...Метод координатного спуска..Ее надо на VBA написать и что б еще и график выводил

    Всего записей: 5 | Зарегистр. 24-05-2009 | Отправлено: 04:25 13-06-2009
    babiych

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    SAS888 - Огромный респект!!!! очень помогли! долго себе голову ломал...  

    Всего записей: 2 | Зарегистр. 03-04-2007 | Отправлено: 19:12 13-06-2009
    filemoto



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    а подскажите, как в комбо назначить ItemData ?
    У меня есть данные:  
    1, Саша
    5, Петя
    8, Коля
     в ВБ6.0 я делал так:

    Код:
    .AddItem "Саша"
    .ItemData(cmbShops.newIndex) = 1
    .AddItem "Петя"
    .ItemData(cmbShops.newIndex) = 5
    .AddItem "Коля"
    .ItemData(cmbShops.newIndex) = 8

     
    а как подобное в экселевском комбо приделать?
    мне нужно получить id выбранного значения.  
     

    Всего записей: 132 | Зарегистр. 08-04-2006 | Отправлено: 22:01 13-06-2009
    jurris



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Уважаемые, помогите пожалуйста упростить задачу если это возможно.

    Код:
    Option Base 1
    Sub test()
    Dim x(1 To 100) 'массив
     
    For i = 1 To 100
    x(i) = Sheets(1).Cells(i, 1).Value 'вношу значения диапазона Range("A1:A100") в массив x(1 To 100)
    Next i

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

    Код:
    a=x(1)
    b=x(2)
    ... и т.д.
    z=x(26)
    ... и т.д.
    zz=x(100)
    End Sub
     

    Но как можно это присваивание сделать по другому? Например с помощью цыкла или массива?
    Например Array(a,b,c, ... ,z, ... ,zz)=x(1 to 100). Но это выражение не принимается. Как всетаки это возможно сделать?

    Всего записей: 535 | Зарегистр. 13-01-2005 | Отправлено: 22:56 16-06-2009 | Исправлено: jurris, 23:00 16-06-2009
    SAS888

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    jurris
    Во-первых, получить массив данных из диапазона "A1:A100" листа Sheets(1) можно существенно проще, без всяких циклов:

    Код:
    Sub test()
        x = Sheets(1).[A1:A100].Value
    End Sub

    В результате, получим массив x размерностью 100Х1 (количество строк Х количество столбцов). Необходимо иметь ввиду, что массив 2-мерный, не смотря на то, что вторая размерность равна 1. Уж так принято в Excel. Поэтому, при обращении к элементам полученного массива, используйте, например, так: x(25, 1) - это значение ячейки Sheets(1).Range("A25").
     
    Во-вторых, очень не понятно, зачем присваивать каким-то еще переменным значения этого массива? У нас ведь уже есть эти переменные. Например, x(1, 1), x(2, 1), x(3, 1) и все остальные. Почему нельзя использовать их?

    Всего записей: 398 | Зарегистр. 31-10-2007 | Отправлено: 05:07 17-06-2009 | Исправлено: SAS888, 05:08 17-06-2009
    Joshya



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

    Всего записей: 1098 | Зарегистр. 18-12-2001 | Отправлено: 12:31 17-06-2009
    jurris



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    SAS888,
    Вообще-то я мог бы использовать сами x(1, 1), x(2, 1), x(3, 1) ...  x(100, 1) вместо переменных. Но тогда полностью теряется удобочитаемость скрипта и становится непонятно что и где, ведь там около сотни переменных с входного массива, а кроме того еще в процессе обработки новые появляются... А скрипт достаточно обьемный.
    Скрипт работает. Но просто хотелось бы немного упростить процес ввода опытных данных. Чтобы не приходилось вручную для новых опытов прописывать все 100 переменных, а одним новым массивом например.

    Всего записей: 535 | Зарегистр. 13-01-2005 | Отправлено: 12:44 17-06-2009 | Исправлено: jurris, 14:05 17-06-2009
    MaximuS G

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Всем привет!
    Кто знает почему при сохранени книги методом  
    ActiveWorkbook.SaveAs (bookname), FileFormat:=xlNormal
    при использовании цикла, во время которого происходит сохранение порядка 100 книг, примерно 10 из них сохраняются без расширения .xls, с остальные сохраняются нормально ? Кто подскажет ? Заранее спасибо!
     
     
    Добавлено:
    Joshya
    У меня была похожая задача, только значения суммы этих чисел должны были попасть в диапазон, вместо того что-бы равняться одному числу. Посмотрите здесь:
    http://www.sql.ru/forum/actualthread.aspx?tid=657473
    Если что неясно, спрашивайте.

    Всего записей: 113 | Зарегистр. 15-08-2008 | Отправлено: 18:37 17-06-2009
    MaximuS G

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Что-то никто ничего ...
     
    SAS888
    Вы наверное уже профи в VBA. Вот это классно: x = Sheets(1).[A1:A100].Value, а я все время через циклы ... А Вы еще пишете на чем нибудь кроме VBA и VB наверное ?...

    Всего записей: 113 | Зарегистр. 15-08-2008 | Отправлено: 15:34 18-06-2009
    SAS888

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

    Цитата:
    примерно 10 из них сохраняются без расширения .xls

    Эти "примерно 10" книг имеют какую-нибудь особенность? Например, определенные знаки (точки и т.п.) в имени. Или они случайны?
    При формировании строковой переменной "bookname", Вы добавляете к имени файла расширение ( & ".xls")?
     
    P.S. Начинал на VB. Сейчас только VBA. (Для личных сообщений используйте "личный ящик".)

    Всего записей: 398 | Зарегистр. 31-10-2007 | Отправлено: 07:56 19-06-2009
       

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

    Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Excel VBA (часть 2)
    ShIvADeSt (11-01-2010 10:17): http://forum.ru-board.com/topic.cgi?forum=33&topic=10903


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

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

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru