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

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

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

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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

Открыть новую тему     Написать ответ в эту тему

ShIvADeSt



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

 
 

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

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

  • Всего записей: 3918 | Зарегистр. 29-07-2003 | Отправлено: 10:16 11-01-2010 | Исправлено: aRLi, 03:15 25-11-2014
    PrWork1

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

    Цитата:
    раз вылазит назойливое сообщение  

    Наверняка это сообщение можно как-то отключить.

    Всего записей: 579 | Зарегистр. 15-12-2005 | Отправлено: 10:00 28-01-2010
    JekG

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Переименовать файл просто изменив расширение это не решение проблемы. Файлы 2007 и 2003 отличаются кроме названия еще и структурой, которая естественно при переименовании не меняется. Поэтому и орет эксель на левое название которое не соответствует содержанию.  
    mrdime
    Microsoft File Format Converters бесплатная прога от майкрософта которая позволяет открывать файлы 2007 офиса в 2003. Просто и без всякого конверта.

    Всего записей: 2123 | Зарегистр. 12-10-2005 | Отправлено: 10:01 28-01-2010
    ZlydenGL



    Moderator
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    JekG, зачем так усложнять? Нужно же просто расширение файла сменить, и все - а это банальным батником делается, безо всяких VBA/VBScript

    Всего записей: 3279 | Зарегистр. 22-06-2002 | Отправлено: 10:04 28-01-2010
    JekG

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ZlydenGL
     Ну смотря какая стоит задача. Если просто переименовать то да, а вот если полноценно с ними работать да еще чтоб их открыл и 2007 офис при необходимости отут проблема. Но эт в любом случае не в этот топик.

    Всего записей: 2123 | Зарегистр. 12-10-2005 | Отправлено: 10:22 28-01-2010
    ZlydenGL



    Moderator
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    JekG, дык вообще-то такая задача и стоит, ибо

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

     
    А дальше все просто - если генерация производится при помощи компоненты офиса 2007 - то надо просто поменять расширение на xlsx, если при помощи офиса 2003 - то на xls  и все, задача решена - Excel ругаться при открытии уже ни на что не будет.

    Всего записей: 3279 | Зарегистр. 22-06-2002 | Отправлено: 10:26 28-01-2010
    mrdime



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ZlydenGL
    Ты не понял. Они уже переименованы в .xls, как я писал выше, и Эксел как раз и ругается на неверный формат. Проблема их всех програмно переконвертить в .xlsx, чтобы дальше нормально работать.  
     

    Всего записей: 2638 | Зарегистр. 04-01-2005 | Отправлено: 10:39 28-01-2010 | Исправлено: mrdime, 10:44 28-01-2010
    ZlydenGL



    Moderator
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    mrdime, пардон, стормозил. Ну тогда переименовывай расширение обратно в XML - с этим форматом MS Excel 2007 вроде бы работает без проблем? Или тебе важно именно нативный формат получить?

    Всего записей: 3279 | Зарегистр. 22-06-2002 | Отправлено: 10:42 28-01-2010
    mrdime



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    JekG
    Файлконвертор мне не нужен. Office 2007 (который у меня установлен) сам все прекрасно делает.
    ZlydenGL
    С .xml - на самом деле работает нормально. Но хотелы бы работать все-же с файлами в его родном формате .xlsx
    Т.е. вариантов обхода есть, но хотелось бы это сделать програмно.

    Всего записей: 2638 | Зарегистр. 04-01-2005 | Отправлено: 10:51 28-01-2010
    ZlydenGL



    Moderator
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    mrdime, тогда через VBA/VBScript вызывай
     

    Код:
    Set WB = Workbooks.Open "filename.xml"
    WB.SaveAs "filename.xlsx", fileformat = 52
    WB.Close

    Всего записей: 3279 | Зарегистр. 22-06-2002 | Отправлено: 10:57 28-01-2010
    mrdime



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ZlydenGL
    Если можно: немного ликбеза. Со скриптами я никогда не работал раньше.  
    Какой файл создавать? С каким расширением? Это все можно делать просто из блокнота?

    Всего записей: 2638 | Зарегистр. 04-01-2005 | Отправлено: 11:00 28-01-2010 | Исправлено: mrdime, 11:03 28-01-2010
    JekG

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    mrdime
    Сервис/Макрос/Начать запись потом Остановить запись Потом Сервис/Макрос/Макросы выбрать Макрос1 нажать редактировать и в тело вставить код от ZlydenGL
    в таком виде  
     

    Код:
    Sub Макрос1()
    Set WB = Workbooks.Open "filename.xml"  
    WB.SaveAs "filename.xlsx", fileformat = 52  
    WB.Close  
    End Sub

    Всего записей: 2123 | Зарегистр. 12-10-2005 | Отправлено: 11:24 28-01-2010
    mrdime



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    JekG
    Сорри, тупанул.
     
    Не понимаю почему, но выдает ошибку в строке  
    Set WB = Workbooks.Open "filename.xml"
    Вместо "filename.xml" вставляю текстовую переменную. Хотя в любом случае выдает ошибку сразу же.

    Всего записей: 2638 | Зарегистр. 04-01-2005 | Отправлено: 11:27 28-01-2010
    ZlydenGL



    Moderator
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    mrdime, а переменную WB как Workbook объявил?

    Всего записей: 3279 | Зарегистр. 22-06-2002 | Отправлено: 11:28 28-01-2010 | Исправлено: ZlydenGL, 11:29 28-01-2010
    mrdime



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ZlydenGL
    Объявил.
    Все равно ошибку выдает.
    Чтобы всем было понятно, что и как. Привожу свой код в сыром (т.е. пока неработающем виде)
     
    Sub ChangeFull_xls()
     
    Dim iDotPos As Integer
    Dim iSlashPos As Integer
    Dim ExpFileName As String
    Dim DirName As String
    Dim File_Name(1 To 20) As String
    Dim FileList As String
    Dim I As Integer
    Dim WB As Workbook
         
        ExpFileName = ActiveWorkbook.Name
        I = 1
        File_Name(I) = Dir("")
        Do
            I = I + 1
            File_Name(I) = Dir
        Loop Until File_Name(I) = ""
     
        For Y = 1 To I - 1
            iDotPos = InStrRev(File_Name(Y), ".")
            Set WB = Workbooks.Open FileName:= File_Name(Y)
            ExpFileName = Left$(ExpFileName, iDotPos - 1) + ".xlsx"
            WB.SaveAs ExpFileName, FileFormat = 52
            WB.Close
        Next Y
         
    End Sub
     
    Красным - выделена ошибка.
    Т.е. макрос, ищет все файлы в папке с активным (открытым) файлом, записывает их в массив. Потом все файлы по-очереди открываются и конвертируются.

    Всего записей: 2638 | Зарегистр. 04-01-2005 | Отправлено: 11:50 28-01-2010 | Исправлено: mrdime, 11:51 28-01-2010
    ZlydenGL



    Moderator
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    mrdime, жесть полная Чем тебя фукнция Dir() так обидела, что ты ее так хитропятоточково пользуешь?  
     
    Добавлено:
    Правильней будет так:
     

    Код:
    Sub ChangeFull_xls()  
    Dim FName As String  
    Dim WB As Workbook
    Dim iDotPos Integer
    Dim ExpFileName As String
         
        Fname = Dir(Thisworkbook.Path & "\*.xls")  
        While FName<>""  
            iDotPos = InStrRev(FName(Y), ".")  
            Set WB = Workbooks.Open(FName)
            ExpFileName = Left(FName, iDotPos - 1) + ".xlsx"  
            WB.SaveAs ExpFileName, FileFormat = 52  
            WB.Close  
            FName=Dir()
        Wend  
    End Sub  

     
    Дальше сам

    Всего записей: 3279 | Зарегистр. 22-06-2002 | Отправлено: 12:03 28-01-2010 | Исправлено: ZlydenGL, 12:25 28-01-2010
    JekG

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

    Код:
    echo off  
    ren *.xml *.xlsx

    Всего записей: 2123 | Зарегистр. 12-10-2005 | Отправлено: 12:17 28-01-2010
    ZlydenGL



    Moderator
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    JekG, дык при этом же Ёксель будет ругаться, что форматы не совпадают?

    Всего записей: 3279 | Зарегистр. 22-06-2002 | Отправлено: 12:24 28-01-2010
    mrdime



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

    Цитата:
    Чем тебя фукнция Dir() так обидела

    Я VBA в основном "методом тыка" изучаю. Где-то Help почитал, где-то кусок какой-то статьи. Посему многого не знаю.
    Доработал твой код:

    Цитата:
    Sub ChangeFull_new_xls()
     
    Dim FName As String
    Dim WB As Workbook
    Dim iDotPos As Integer
    Dim ExpFileName As String
         
        FName = Dir(ActiveWorkbook.Path & "\*.xls")
        While FName <> ""
            iDotPos = InStrRev(FName, ".")
            ExpFileName = FName
            Set WB = Workbooks.Open(ActiveWorkbook.Path + "\" + FName)
            ExpFileName = Left$(ExpFileName, iDotPos - 1) + ".xlsx"
            WB.SaveAs ExpFileName, FileFormat = 52
            WB.Close
            FName = Dir()
        Wend
    End Sub

    На этапе SaveAs возникает ошибка 1004: "Method 'Save As' of object '_Workbook' failed."
    В чем может быть проблема?

    Всего записей: 2638 | Зарегистр. 04-01-2005 | Отправлено: 12:28 28-01-2010
    ZlydenGL



    Moderator
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    mrdime, привыкай вместо ActiveWorkBook пользовать все-таки ThisWorkbook, так намного надежней и удобней.
     
    Почему не работает SaveAs - проще уже разбирать тебе Открой MSDN, может я просто неправильно описал его вызов. Или попробуй написать так:
     

    Код:
    WB.SaveAs ExpFileName, FileFormat := 52  

     
    Кстати, а зачем такие сложности с манипуляциями над именами файлов? У тебя же файлы с расширением .xls, тебе надо получить .xlsx, правильно? Тогда достаточно написать так:
     

    Код:
    WB.SaveAs FName & "x", FileFormat := 52  

    Всего записей: 3279 | Зарегистр. 22-06-2002 | Отправлено: 12:34 28-01-2010
    mrdime



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

    Цитата:
    привыкай вместо ActiveWorkBook пользовать все-таки ThisWorkbook

    ThisWorkbook не катит, т.к. почему-то активной становится не папка файла из которого пошел вызов макроса, а папка, в которой находится мой файл с макросами Personal.xlsb и соответственно поиск идет уже в ней (что мне совершенно не нужно).
    Когда использую ActiveWorkBook - такого не происходит.
    Насчет:

    Цитата:
    FName & "x"

    Просто отличная идея! Я зациклился на "стандартных" методах.
     
    Добавлено
    Все. Уже разобрался.
    Привожу доработанный код. Может кому-нибудь пригодится на будущее.

    Цитата:
    Sub ChangeFull_new_xls()
    Dim FName As String
    Dim WB As Workbook
    Dim iDotPos As Integer
    Dim DirPath As String
         
        FName = Dir(ActiveWorkbook.Path & "\*.xls")
        DirPath = ActiveWorkbook.Path + "\"
        While FName <> ""
            If Right$(FName, 5) <> ".xlsx" Then
                Set WB = Workbooks.Open(DirPath + FName)
                WB.SaveAs DirPath & FName & "x", FileFormat:=xlOpenXMLWorkbook
                WB.Close
            End If
            FName = Dir()
        Wend
    End Sub

    Единственное с чем пока не разобрался: как убрать назойливое сообщение при открытии первого файла о несоответствии форматов.

    Всего записей: 2638 | Зарегистр. 04-01-2005 | Отправлено: 12:44 28-01-2010 | Исправлено: mrdime, 13:30 28-01-2010
    Открыть новую тему     Написать ответ в эту тему

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

    Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Excel VBA (часть 3)

    Имя:
    Пароль:
    Сообщение

    Для вставки имени, кликните на нем.

    Опции сообщенияДобавить свою подпись
    Подписаться на получение ответов по e-mail
    Добавить тему в личные закладки
    Разрешить смайлики?
    Запретить коды


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

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.Board
    © Ru.Board 2000-2018

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru