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

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

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

    Всего записей: 108 | Зарегистр. 23-01-2006 | Отправлено: 06:49 04-03-2008
    SAS888

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    kartav
    Посмотри  здесь
     
    Добавлено:
    zas
    А что, "Trim" не устраивает (в рус. версии - "СЖПРОБЕЛЫ").

    Всего записей: 398 | Зарегистр. 31-10-2007 | Отправлено: 07:42 04-03-2008
    zas

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


    Цитата:
    zas  
    А что, "Trim" не устраивает (в рус. версии - "СЖПРОБЕЛЫ").

     
    не непомагает есть пробел или пробелы перед цифрой и после цифры и надо их убрать.

    Всего записей: 108 | Зарегистр. 23-01-2006 | Отправлено: 07:54 04-03-2008
    SAS888

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    zas
    Если, например, на рабочем листе Excel в ячейке "A1" находится " 5" (с пробелоами в начале или в конце), то вводим в "B1" формулу "=СЖПРОБЕЛЫ(A1)" и получим "5" без пробелов.
    В VBA - Range("B1") = Trim(Range("A1")) уберет начальные и конечные пробелы, а Range("B1") = Application.Trim(Range("A1")) уберет еще и все "лишние" пробелы между словами, оставив по одному.

    Всего записей: 398 | Зарегистр. 31-10-2007 | Отправлено: 08:52 04-03-2008
    ebrr

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

    Цитата:
    Нашел в книге "Трюки и эффекты excel" пример простого калькулятора:  
     
    Sub simpleCalculator()  
    On Error GoTo errors  
     
    Dim strExpr As String  
    strExpr = InputBox("Под рукой нет калькулятора? Тогда вводите выражение в виде: 2+2*15/3*3-4+(5-2)/2  и нажмите Enter или OK", "Калькулятор")  
    MsgBox strExpr & "=" & Application.Evaluate(strExpr)  
     
     
    errors:  
    End Sub  
     
    Подскажите пожалуйста как можно сделать так чтобы ответ выводился рядом сразу же в процессе введения выражения. Т.е. чтобы рядом с знаком = сразу же при введении 2+2 выводилось 4, и если пользователь продолжить вводит выражения (например 2+2*7-1 и т.д.), то ответ должен считаться автоматически без нажатия на ОК или Enter. Попытался создать пользовательскую форму в виде: ВЫРАЖЕНИЕ=АВТОМАТИЧЕСКИЙ ОТВЕТ но так как знаний пока не хватает обращаюсь к профи.  
    Буду признателен за любую помощь.

     
    Сделал форму где для ввода выражения (формулы) испольщуется MsgBox а для вывода Label.  
     
    Вписал следующий код:
     
    Private Sub TextBox1_Change()
     
    Dim strExpr As String
    strExpr = TextBox1.Value
    Label1.Caption = Application.Evaluate(strExpr)
     
    End Sub
     
    Конечно же вылезает ошибка.

    Всего записей: 36 | Зарегистр. 19-07-2007 | Отправлено: 10:12 04-03-2008
    Troitsky



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

    Цитата:
     вылезает ошибка

    либо перед вычислением самостоятельно проверяй строку на соответствие (чтобы в ней содержалось законченное выражение), либо там же ставь обработчик ошибок (к примеру, On Error Resume Next).


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

    Всего записей: 795 | Зарегистр. 13-12-2003 | Отправлено: 11:43 04-03-2008
    ol7ca

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

    Всего записей: 125 | Зарегистр. 01-02-2007 | Отправлено: 18:32 04-03-2008
    DocBeen



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

    Цитата:
    Код:Sub Main()  
     
        Dim i As Long, q As Long, LastR As Long  
        LastR = Cells(Columns("A").Rows.Count, "A").End(xlUp).Row ' Это номер последней строки в столбце "A"  
        i = 1  
        q = 2  
        Do While i < LastR  
            Do While q < LastR  
    Loop10:     If Cells(i, "A") = Cells(q, "A") Then  
                    Cells(i, "C") = Cells(i, "C") + Cells(q, "C")  
                    Rows(q).Delete  
                    LastR = LastR - 1  
                    GoTo Loop10  
                End If  
                q = q + 1  
            Loop  
            i = i + 1  
            q = i + 1  
        Loop  
     
    End Sub

     
    Спасибо огромное - все работает
     

    Всего записей: 147 | Зарегистр. 15-07-2005 | Отправлено: 23:43 04-03-2008
    vasiliy74



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Пытаюсь записать в макрос формулу из листа она очень длинная и мне выходит сообщение о том что запись не возможна?!?!?!
     
    Добавлено:
    записал в ручную, но пишет ИМЯ? и только после того как я захожу в ячейку и и ставлю курсор в поле её строки и жму enter все начинает работать

    Всего записей: 289 | Зарегистр. 21-02-2006 | Отправлено: 13:34 05-03-2008
    kalinakrasnay



    Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Здрасте снова всем. Возникла проблемка.
    Итак, нужно прочитать файл bmp по символьно (ну как-будто блокнотом), делаю так

    Цитата:
        Set fs = CreateObject("Scripting.FileSystemObject")
        Set f = fs.OpenTextFile(ActiveWorkbook.Path + "\" + "00000008_12.bmp", ForReading, False)
        Set fail = fs.CreateTextFile(ActiveWorkbook.Path + "\" + "12.bmp", True)
    Do While Not f.AtEndOfStream
            fail.Write (f.Read(dl))
    Loop

    ну вот я дохожу до конца файла...все нормально, но потом позже требуется опять читать из файла 00000008_12.bmp и тут проблема:  
    пишет "что уже конец файла", если такое свойство, с помщью которого можно переместиться опять в начало файла.
    п.с. щас я делаю close файла, а потом опять его открываю, но это как-то по тупому, с учетом того, что  это в программе у меня встречается несколько раз...
     

    Всего записей: 351 | Зарегистр. 04-01-2007 | Отправлено: 22:20 05-03-2008 | Исправлено: kalinakrasnay, 22:20 05-03-2008
    AndVGri

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

    Код:
     
        Dim fNum As Integer, bReader As Byte, bArray() As Byte
        fNum = Freefile()
        Open "d:\path\qqq.bmp" For Binary As #fNum Len=1
        'Считать байт
        Get #fNum, position, bReader
        'Считать массив байтов
        Redim bArray(1 To 5)
        Get #fNum, position, bArray
     

     

    Цитата:
    Цитата:
        Set fs = CreateObject("Scripting.FileSystemObject")
        Set f = fs.OpenTextFile(ActiveWorkbook.Path + "\" + "00000008_12.bmp", ForReading, False)
        Set fail = fs.CreateTextFile(ActiveWorkbook.Path + "\" + "12.bmp", True)
    Do While Not f.AtEndOfStream
            fail.Write (f.Read(dl))
    Loop
     

    А это больше смахивает на копирование (полное) из одного файла в другой.

    Всего записей: 750 | Зарегистр. 14-12-2005 | Отправлено: 02:14 06-03-2008 | Исправлено: AndVGri, 02:15 06-03-2008
    kalinakrasnay



    Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    AndVGri
    Спасибо...но немного не то (видно я непонятно выразилась)

    Цитата:
    А чем классика с бинарным байтовым доступом плоха?

    не знаю уж чем она плоха, но в иституте объяснили так как написала я..., поэтому бинарный доступ видно не катит...

    Цитата:
    А это больше смахивает на копирование (полное) из одного файла в другой.

    ну да, я делаю в том числе и копирование файлов (такое задание), ну а потом я так сказать скопированный файл "порчу"...

    Всего записей: 351 | Зарегистр. 04-01-2007 | Отправлено: 07:02 06-03-2008
    ol7ca

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Подскажите, пожалуйста,
    почему-то возникает ошибка (subscript out of range) в строке Set ws = Sheets(a(i))
    хотя скрипт свою задачу выполняет.
    и каковы правила записи
    а то ошибка повторяется и в других примерах
    спасибо.
     
    Dim i As Integer, a
    Dim ws As Worksheet
    Application.ScreenUpdating = False
     
    a = Array("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12")
    For i = 0 To UBound(a)
    Set ws = Sheets(a(i))
    With ws
    .Unprotect (123)
    Application.CutCopyMode = False
       
            End With
        Next
    Application.ScreenUpdating = True

    Всего записей: 125 | Зарегистр. 01-02-2007 | Отправлено: 07:34 06-03-2008 | Исправлено: ol7ca, 07:37 06-03-2008
    visual73



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ol7ca
    Надо добавить  
    "Option Base 1"
    и изменить
    "For i = 1 To UBound(a)"
     
    или можно по другому, заменить
    "For i = 0 To UBound(a)-1"
     
    Мне больше нравится первый вариант.

    Всего записей: 962 | Зарегистр. 26-12-2005 | Отправлено: 08:50 06-03-2008 | Исправлено: visual73, 08:51 06-03-2008
    SAS888

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ol7ca
    Ваш код почти правильный. Замечания visual73 здесь ни при чем (какая разница, с какого числа начинается счет элементов массива).
    Дело в другом:
     Set ws = Sheets(a(i)), где a(i) = "1", VBA понимает как лист с именем "1", т. е. Sheets("1").
    Если у Вас массив - это имена листов, то ошибки не будет. А если Вы имеете ввиду номера листов, то для обращения к листу нужно преобразовать тип данных элемента массива.
    Т. е. так: Sheets(CInt(a(i))). Ошибки тоже не будет.
    Второй вариант:
    Просто убрать кавычки при задании элементов массива. Т. е. так:
    a = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)
    Тогда компилятор "увидит" не текст, а именно номер.

    Всего записей: 398 | Зарегистр. 31-10-2007 | Отправлено: 09:53 06-03-2008 | Исправлено: SAS888, 10:08 06-03-2008
    visual73



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Можно как-нибудь сделать чтобы второе условие, после слова OR, не проверялось? для случая A>5?
    "If A > 5 Or B>20 Then"
    SAS888
    это потенциальная ошибка

    Всего записей: 962 | Зарегистр. 26-12-2005 | Отправлено: 10:07 06-03-2008 | Исправлено: visual73, 10:08 06-03-2008
    SAS888

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    visual73
    По-моему, в случае с оператором Or, если первое условие выполняется (а этого уже достаточно, чтобы выражение под If стало =True), все последующее и так не проверяются.
    Могу ошибаться, чтобы это проверить - проведите какой-нибудь тест по времени выполнения кода для разных случаев.

    Всего записей: 398 | Зарегистр. 31-10-2007 | Отправлено: 10:16 06-03-2008
    visual73



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    SAS888
    Вот, вот. В том то и дело что уже проверил Результат совсем мне не нравится.
     
    Sub test()  
        i = 0
        j = 5
        If i = 0 Or ggg(j) = 3 Then
            f = 1
        End If  
    End Sub
     
    Function ggg(j)
        ggg = j
    End Function
     
    По любому идет в ggg.  
    На фига она ей нужна, спрашивается? Вот блин!
    Жаль. Буду думать другие варианты.

    Всего записей: 962 | Зарегистр. 26-12-2005 | Отправлено: 10:23 06-03-2008
    SAS888

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    visual73
    Ну, тогда проверять последовательно - сначала "быстрое" условие, затем другое. Например:
    Sub test()
        i = 0
        j = 5
        If i = 0 Then
            f = 1
        Else
            If ggg(j) = 3 Then f = 1
        End If
    End Sub
     
    Function ggg(j)
        ggg = j
    End Function

    Всего записей: 398 | Зарегистр. 31-10-2007 | Отправлено: 10:33 06-03-2008
    Sunnych



    Full Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    В наличии есть несколько папок:
    D:\0401\Входящие\    - множество файлов *.xls
    ................................
    D:\0423\Входящие\    -  множество файлов *.xls
    вот эти *.xls самые файлы мне и нужно во всех папках "Входящие" переименовать в дату изменения файла + добавить нумерацию "()"и к этому имени добавить название каталога который находиться на один уровень выше, пример 06.03.2008.(1).0423.xls , а если в наличии окажеться ещё один файл с такимже именем то 06.03.2008.(2).0423.xls и.т.д
    Но остановился я на слудующем - в хелпах и нете нашёл море информации из которой "понял" (не полностью) как работает поиск
    и вот на этом примере не могу понять каким образом дописать код,  
    1 - я должен, вместо вывода на экран сделай вызов фунции которая в качестве аргумента будет принимать имена файлов
    2 - MyDateTime = FileDateTime("D:\TEMP\FileSearch\*.xls) эта функция из файла получает дату формирует имя и переименовывает файл
    Подскажите в какую степь мне двигаться или где лучше поискать!

    Код:
    Sub rename()
    Dim MyDateTime As Date
    Set fs = Application.FileSearch
    With fs
      .LookIn = "D:\TEMP\FileSearch\"
      .SearchSubFolders = True
      .FileType = msoFileTypeExcelWorkbooks
        If .Execute > 0 Then
        MsgBox "Число найденных файлов = " & .FoundFiles.Count
        For i = 1 To .FoundFiles.Count
         MsgBox .FoundFiles(i)
        Next i
      Else
        MsgBox "Нет файлов"
      End If
    End With

    Всего записей: 409 | Зарегистр. 14-02-2006 | Отправлено: 11:46 06-03-2008 | Исправлено: Sunnych, 16:57 06-03-2008
       

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