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

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



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

    Цитата:
    Содержимое ячейки рано 45,15 (где 45,15 это число) а 45,15 m2 это формат ячейки, тоесть то что мы видим. Так вот, мне удается это сделать вручную, а при записи  форматируем ячейку  вот в такой формфат # ##0,00\ [$ m2.  -1]  то, после записи имеем # ##0,00\ [$ m?.  -1] . При записи символ "2" меняется на "?" .


    Я не совсем уверен, но думаю, что это ограничение ASC-кодировки, которую использует VBA по умолчанию. Чтобы получить символ "в квадрате" вам надо копать в сторону использования UNICODE.
     
    Добавлено:

    Код:
    Dim str1 as String
    ' Вот как читать в переменную в формате UNICODE:
    ' В ячейке символ с кодом 0178 (держим ALT и набираем на NumPad 0178)
    str1 =Cells(1, 1).value
    ' Запись обратно в ячейку
    Cells(2, 2).Value = str1
    ' перевод в ASC, все не-ASC символы будут заменены на вопросы  
    str1 = StrConv(str1, vbFromUnicode)
    ' перевод обратно в UNICODE (поскольку мы потеряли  
    ' все не-ASC символы, то получим строчку с вопросиками).
    ' Данный пример полезен, когда нам надо куда-нибудь передать
    ' текстовую строку в формате UNICODE.
    str1 = StrConv(str1, vbUnicode)
     
     
     
     
    Создать текст в кодировке UNICODE для последующей записи в ячейку:

    Код:
    Dim ABC as String
    ABC="M" + ChrW(&HB2)
    Cells(1, 3).Value=ABC
    ' Получаем M2  

    Коды символов можно найти в стандартной программе Windows charmap.exe.

    ----------
    Джин, не лезь в бутылку.

    Всего записей: 1138 | Зарегистр. 04-05-2007 | Отправлено: 11:55 17-05-2008 | Исправлено: nick7inc, 12:47 17-05-2008
    ZORRO2005



    Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Elena3785
    Формат-Ячейки..
    а в типе:
    [ч]:мм

    Всего записей: 342 | Зарегистр. 08-10-2005 | Отправлено: 18:44 17-05-2008 | Исправлено: ZORRO2005, 18:44 17-05-2008
    ferias



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    nick7inc
    Тема даже очень интересная... возможность сосдания своих символов... Только каким образом можно узнать номер( код символа)
    Цитата:
    символ с кодом 0178
    , ведь если воспользоватся
    Цитата:
    Windows charmap.exe.
    , то оказывается что порядковый номер совсем не 178-й. И второй вопрос, вернее он был первым. Каким методом  я смогу применить к своему формату этот символ "в квадрате", может можно както вставить вместо "2" переменную? Которая будет ровна
    Цитата:
    "M" + ChrW(&HB2)
    ?
    Спасибо огромное.
     
     
     
     

    Всего записей: 39 | Зарегистр. 28-06-2007 | Отправлено: 02:56 18-05-2008
    ol7ca

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

    Всего записей: 125 | Зарегистр. 01-02-2007 | Отправлено: 01:58 19-05-2008
    Luciefer

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

    Всего записей: 25 | Зарегистр. 25-09-2007 | Отправлено: 12:50 19-05-2008
    SAS888

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

    Код:
    Dim FileN As String
        FileN = "MyName.xls"
        Workbooks.Add
        ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & Application.PathSeparator & FileN

    Всего записей: 398 | Зарегистр. 31-10-2007 | Отправлено: 13:47 19-05-2008
    Elena3785

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ferias и CEMEH
    Ребята, спасибо за подсказку.  
     

    Всего записей: 24 | Зарегистр. 11-05-2008 | Отправлено: 22:18 19-05-2008
    Luciefer

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    2SAS888, спасибо...получилось
     
    Добавлено:
    еще такой вопрос:
     
    копирую значение из одного файла в другой таким обазом:
        ActiveWorkbook.ActiveSheet.Cells(i, 2) = Workbooks("buh.xls").Worksheets("Лист1").Cells(i, 2)
     
    Все ок, но, мне надо что бы можно было копировать, даже если файл buh.xls не открыт, и что бы значение полностью копировалось, а не просто ссылка (как это сделано вот тут     'ActiveWorkbook.ActiveSheet.Cells(i, 2).Value = "='[buh.xls]Лист1'!RC"
    ).
     
    Добавлено:
    и еще вопрос
    в первом файле примерно такой текст
     
    5800005    30302840910002000001    70601810010001210221    50,00    1187.62    1187.62    08.05.2008
    Итого (11/05/2008) документов 1 на сумму 100.00                        
    12/05/2008                        
    5800005    30302840910002000001    70601810010001210221    50,00    1187.62    1187.62    08.05.2008
    5800005    30302840910002000001    70601810010001210221    50,00    1187.62    1187.62    08.05.2008
    5800005    30302840910002000001    70601810010001210221    50,00    1187.62    1187.62    08.05.2008
     
     
    Надо удалить строки с итоог и датой при копировании
    как это сделать, к чему прицепиться?

    Всего записей: 25 | Зарегистр. 25-09-2007 | Отправлено: 07:19 20-05-2008 | Исправлено: Luciefer, 07:22 20-05-2008
    SAS888

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Luciefer
    В VBA нет возможности получить данные из закрытой рабочей книги.
    Есть два варианта это сделать:
    1) На свободном месте рабочего листа создать ссылку на ячейку в другой книге, затем скопировать полученное значение (именно значение) и результат использовать по назначению.
    2) Воспользоваться функцией XML:

    Код:
    Dim arg As String
        arg = "'" & ThisWorkbook.path & "\[buh.xls]Лист1'!" & Cells(i, 2).Range("A1").Address(, , xlR1C1)
        ActiveWorkbook.ActiveSheet.Cells(i, 2) = ExecuteExcel4Macro(arg)

    Автор не оговаривает путь к файлу-источнику, поэтому при формировании аргумента (arg) для примера указывается путь к файлу, содержащему данный код.
    P.S. Если нужно, можно вставить проверки: существует ли данный файл, открыт ли он и т.д.
     
    Добавлено:
    Luciefer
    Я бы в цикле копировал все, а затем удалял что нужно.

    Всего записей: 398 | Зарегистр. 31-10-2007 | Отправлено: 10:37 20-05-2008
    Luciefer

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ну..примерн понятно
     
    еще вопрос
     
    у меня копируется сейчас примерно 15000 записей. Естественно все это копируется долго и экран мелькает. Как можно сделать что бы не было мельканий. не было ничего или просто часы песочные были, в общем что бы красиво выглядело а не мелало?

    Всего записей: 25 | Зарегистр. 25-09-2007 | Отправлено: 14:42 20-05-2008
    The okk



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

    Код:
    Application.ScreenUpdating = False

    Отключает обновления экрана на время работы кода.

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 14:59 20-05-2008
    Vitus_Bering



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Luciefer
    Попробуй Application.ScreenUpdating = false

    Всего записей: 936 | Зарегистр. 30-09-2005 | Отправлено: 15:00 20-05-2008
    Luciefer

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Спасибо.
    Очередной вопрос (простите уж меня, ну не шарю я пока в VBA)
    Сделал примерно таким образом копирование ячеек  
     
        ActiveWorkbook.ActiveSheet.Cells(i, 4) = Workbooks("buh.xls").Worksheets("Лист1").Cells(j, 4)
        ActiveWorkbook.ActiveSheet.Columns("D:D").NumberFormat = "0.00"
     
    У меня стоит Office 2003. На другом компе х.з. У меня все ок работает а на другом компе в итоге в ячейках отображаются только целые числа, не целые не отображаются - просто пустая ячейка.
     
     В чем может быть дело?
     
    Добавлено:
    нужно преобразовать из текста в число 47427810310040000024
    если ставлю формат как числовой, то последние цифры изменяются на 00, какой формат использовать для таких чисел кроме текстового? желательно что бы понималось как числа

    Всего записей: 25 | Зарегистр. 25-09-2007 | Отправлено: 07:01 21-05-2008
    SAS888

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    По-другому никак.
    Для того, чтобы иметь возможность работать как с  числами - можно в коде макроса преобразовывать формат в Decimal, делать все математические операции, затем, то, что получилось возвращать в текстовый формат и выводить в ячейку листа.
    Например:
    Пусть даны переменные x и y в текстовом формате. Сложить их можно так:

    Код:
    z = CStr(CDec(x) + CDec(y))
    Где z - текстовая переменная.
     
    Добавлено:
    Обратите внимание, что формат Decimal нельзя объявить исходно (например, Dim x As Decimal - выдаст ошибку).

    Всего записей: 398 | Зарегистр. 31-10-2007 | Отправлено: 12:39 21-05-2008 | Исправлено: SAS888, 12:45 21-05-2008
    Vitus_Bering



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

    Цитата:
    преобразовать из текста в число 47427810310040000024

    Excel работает только с пятнадцатизначными числам.

    Всего записей: 936 | Зарегистр. 30-09-2005 | Отправлено: 12:58 21-05-2008
    MRyuka

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Помоги те пожалуйста я написал макрос для печати выделенного фрагмента а можно ли еще и сохранить его как нибудь на диск скажем в формате .txt или что нить в духе
    Private Sub CommandButton1_Click()
     
        Range("A1:J34").Select
        Range("J34").Activate
        Selection.PrintOut Copies:=1, Collate:=True
     
    End Sub
     
    Большое спасибо заранее очень нужно

    Всего записей: 2 | Зарегистр. 21-05-2008 | Отправлено: 21:45 21-05-2008
    SAS888

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

    Всего записей: 398 | Зарегистр. 31-10-2007 | Отправлено: 07:36 22-05-2008
    abasov



    Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    В скрипте ниже берется ФИО и преобразуется в лат фамилия и имя отчество сокращается до двух символов: Ларина Лариса Юрьевна -> larinalyu. Можно оставить только один символ имени, отчества? что бы получилось: larinaly
     

    Код:
     Function latinStr(ByVal sStr As String)
        Dim iCount, i As Integer
        Dim sChar As String
        Dim Res As String
        Dim ByCode As Integer
         
         
        Res = ""
        iCount = Len(sStr)
        For i = 1 To iCount Step 1
           sChar = Mid(sStr, i, 1)
           Select Case sChar
               Case "ô", "Ô"
                   Res = Res + "f"
               Case "û", "Û"
                   Res = Res + "y"
               Case "â", "Â"
                   Res = Res + "v"
               Case "à", "À"
                   Res = Res + "a"
               Case "ï", "Ï"
                   Res = Res + "p"
               Case "ð", "Ð"
                   Res = Res + "r"
               Case "î", "Î"
                   Res = Res + "o"
               Case "ë", "Ë"
                   Res = Res + "l"
               Case "ä", "Ä"
                   Res = Res + "d"
               Case "æ", "Æ"
                   Res = Res + "zh"
               Case "ý", "Ý"
                   Res = Res + "e"
               Case "é", "É"
                   Res = Res + "y"
               Case "ö", "Ö"
                   Res = Res + "c"
               Case "ó", "Ó"
                   Res = Res + "u"
               Case "ê", "Ê"
                   Res = Res + "k"
               Case "å", "Å"
                   Res = Res + "e"
               Case "í", "Í"
                   Res = Res + "n"
               Case "ã", "Ã"
                   Res = Res + "g"
               Case "ø", "Ø"
                   Res = Res + "h"
               Case "ù", "Ù"
                   Res = Res + "ch"
               Case "ç", "Ç"
                   Res = Res + "z"
               Case "õ", "Õ"
                   Res = Res + "h"
               Case "ú", "Ú"
                   Res = Res + ""
               Case "ÿ", "ß"
                   Res = Res + "ya"
               Case "÷", "×"
                   Res = Res + "ch"
               Case "ñ", "Ñ"
                   Res = Res + "s"
               Case "ì", "Ì"
                   Res = Res + "m"
               Case "è", "È"
                   Res = Res + "i"
               Case "ò", "Ò"
                   Res = Res + "t"
               Case "ü", "Ü"
                   Res = Res + ""
               Case "á", "Á"
                   Res = Res + "b"
               Case "þ", "Þ"
                   Res = Res + "yu"
           End Select
        Next
        latinStr = Res
    End Function
     
     
    Function ConvertFIO(ByVal sBuff As String)
        Dim sF, sI, sO As String
        Dim pos As Integer
        sBuff = Trim(sBuff)
        pos = InStr(1, sBuff, " ", vbTextCompare)
        If pos < 1 Then
            ConvertFIO = "error"
            Return
        End If
        sF = Left(sBuff, pos - 1)
        sBuff = Mid(sBuff, pos + 1)
        pos = InStr(1, sBuff, " ", vbTextCompare)
        If pos > 0 Then
            sI = Left(sBuff, 1)
            sO = Mid(sBuff, pos + 1, 1)
        End If
        ConvertFIO = latinStr(sF) & latinStr(sI) & latinStr(sO)
    End Function
     

    Всего записей: 345 | Зарегистр. 12-11-2002 | Отправлено: 09:49 22-05-2008 | Исправлено: abasov, 09:51 22-05-2008
    SAS888

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

    Код:
    Function ABC(Data)
        Dim a() As String, i As Integer
        Rus = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя"
        Trans = Array("", "A", "B", "V", "G", "D", "E", "Jo", "Zh", "Z", "I", "Jj", _
            "K", "L", "M", "N", "O", "P", "R", "S", "T", "U", "F", "H", "C", "Ch", "Sh", _
            "Zch", "''", "'Y", "'", "Eh", "Ju", "Ja", "a", "b", "v", "g", "d", "e", _
            "jo", "zh", "z", "i", "jj", "k", "l", "m", "n", "o", "p", "r", "s", "t", "u", _
            "f", "h", "c", "ch", "sh", "zch", "''", "'y", "'", "eh", "ju", "ja")
     
        For i = 1 To 65
            Data = Replace(Data, Mid(Rus, i, 1), Trans(i), , , vbBinaryCompare)
        Next
     
        If Data = "" Then Exit Function
        a = Split(Data, " ")
        If UBound(a) < 2 Then Exit Function
        Data = a(0) & Left(a(1), 1) & Left(a(2), 1)
        ABC = Data
         
    End Function

    Всего записей: 398 | Зарегистр. 31-10-2007 | Отправлено: 10:38 22-05-2008
    abasov



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

    Всего записей: 345 | Зарегистр. 12-11-2002 | Отправлено: 11:25 22-05-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