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

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



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

    Цитата:
    При помощи кнопочки на форме вызывается экспорт счета в Эксель на основании шаблона Bill.xlt. Он сохраняется уже из Excel.

     
    при помощи "той же самой кнопочки" ты можешь не только эскпортировать, но и заранее сохранить файл с выбранным именем, ДО того  как юзеру этот счет выскочит для правки в excele...
     
    в какой момент это лучше сделать, зависит от твоей "технологии экспорта".
    покажи код.

    Всего записей: 324 | Зарегистр. 20-05-2005 | Отправлено: 13:02 27-12-2006
    WWWovan



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

    Цитата:
    при помощи "той же самой кнопочки" ты можешь не только эскпортировать, но и заранее сохранить файл с выбранным именем, ДО того  как юзеру этот счет выскочит для правки в excele...

     
    В том то и дело, что заранее файл сохранять не нужно. Нужно просто чтобы каким-то образом при вызове сохранения пользователем подставлялось нужное имя файла.
     
    Ниже код...

    Цитата:
     
    void __fastcall TBillForm::sbCopyToExcelClick(TObject *Sender)
    {
      TKeyboardState KeyState;
      GetKeyboardState(KeyState);
      bool SendEMail = KeyboardStateToShiftState(KeyState).Contains(ssCtrl);
      if(ActiveControl==BillTGrid)
        BillTGrid->OnExit(Sender);
      ToBillRecord();
      CConfigEntry *CfgRec = new CConfigEntry;
      CfgRec->Load("TEMPLPATH");
      String TemplateName = CfgRec->Value + String("\\BILL.XLT");
      delete CfgRec;
      Variant App, Sh;
      App = ExcelInit();
      if(App.IsNull()) {
        Application->MessageBox("Невозможно открыть Microsoft Excel. "
        "Возможно, это приложение на компьютере не установлено.","Ошибка",MB_OK+MB_ICONERROR);
        return;
      }
      Sh = ExcelAddWB(App,TemplateName);
      if(Sh.IsNull()) {
        Application->MessageBox("Ошибка при создании книги Microsoft Excel.","Ошибка",MB_OK+MB_ICONERROR);
        return;
      }
      toExcel(App,"НомерСчета","Рахунок-фактура    "+BillRec.Num+"    від    "+DateToStr(BillRec.Date)+".");
      CClientEntry *ClRec = new CClientEntry;
      ClRec->Load(BillRec.Client);
      toExcel(App,"Плательщик",ClRec->LegalName);
      toExcel(App,"ТелПлательщика",ClRec->Tel);
      toExcel(App,"ФаксПлательщика",ClRec->Fax);
      String ClEMail = Trim(ClRec->EMail);
      delete ClRec;
      if(Trim(ClEMail)!="")
        ExcelHyperLink(App,"Плательщик","mailto:"+Trim(ClEMail));
      toExcel(App,"ИтогоБезНДС",FloatToStrMExcel(BillRec.Amount/NDS_Mul));
      toExcel(App,"НДС",FloatToStrMExcel(BillRec.Amount-BillRec.Amount/NDS_Mul));
      toExcel(App,"Итого",FloatToStrMExcel(BillRec.Amount));
      toExcel(App,"ИтогоПрописью",CurrToStrM(BillRec.Amount));
      toExcel(App,"Исполнитель",BillRec.AutorName);
      ExcelAddRows(App,"НомТовара",BillRec.Recs->Count-1);
      CBillTEntry *BillTRec;
      for(int i=0;i<BillRec.Recs->Count;i++) {
        BillTRec = BillRec.Recs->Item(i);
        toExcel(App,"НомТовара",i,(IntToStr(i+1)+".").c_str());
        toExcel(App,"НазвТовара",i,BillTRec->WareName.c_str());
        toExcel(App,"ЦенаТовара",i,FloatToStrMExcel(BillTRec->Price/NDS_Mul));
        toExcel(App,"КолТовара",i,BillTRec->Count);
        toExcel(App,"СуммаТовара",i,FloatToStrMExcel(BillTRec->Amount/NDS_Mul));
      }
     
      App.OlePropertySet("Visible",true);
    }


    ----------
    Не несу ответственность за случайно допущенные орфографические ошибки.

    Всего записей: 578 | Зарегистр. 15-11-2003 | Отправлено: 13:57 27-12-2006 | Исправлено: WWWovan, 13:59 27-12-2006
    Anton T

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

    Всего записей: 325 | Зарегистр. 12-04-2006 | Отправлено: 16:00 27-12-2006
    jONES1979



    Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    WWWovan
     
    а обрати внимание: когда Ексель УЖЕ выскочил юзеру для правки, в заголовке НЕТ ЛИ УЖЕ имени Bill1 [Bill2, Bill3, etc].  
    Догадываюсь, что оно уже бужет сформировано по умолчанию, но подтверди, в твоём случае это так?
     
    Добавлено:
     
    Цитата:
    В том то и дело, что заранее файл сохранять не нужно
    , ну если это категорично, то да.. делать надо уже в экселе

    Всего записей: 324 | Зарегистр. 20-05-2005 | Отправлено: 15:32 28-12-2006
    WWWovan



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

    Цитата:
    а обрати внимание: когда Ексель УЖЕ выскочил юзеру для правки, в заголовке НЕТ ЛИ УЖЕ имени Bill1 [Bill2, Bill3, etc].  
    Догадываюсь, что оно уже бужет сформировано по умолчанию, но подтверди, в твоём случае это так?

     
    Да. Присутствует.
     

    Цитата:
    делать надо уже в экселе

     
    Вопрос в том как?


    ----------
    Не несу ответственность за случайно допущенные орфографические ошибки.

    Всего записей: 578 | Зарегистр. 15-11-2003 | Отправлено: 15:46 28-12-2006
    giash



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Здравствуйте! С наступающим! Понимаю, что, скорее всего, в ближайшее время ответа мне не дождаться. Но все же
    У меня возникла такая проблема: мне необходимо ежемесячно вставлять лист из одной книги в другую ввиде ссылок. нельзя ли сделать так, чтобы в определенной ячейке листа в который переносятся данные вводить название файла, напр. januari,  из которого эти данные берутся, благодаря чему обновление будет осуществляться автоматически.
    Заранее всем благодарен
    Еще раз с новым годом!

    Всего записей: 10 | Зарегистр. 18-12-2006 | Отправлено: 12:01 29-12-2006
    The okk



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

    Цитата:
    Понимаю, что, скорее всего, в ближайшее время ответа мне не дождаться.

    Зря ты так думаешь.

    Цитата:
    мне необходимо ежемесячно вставлять лист из одной книги в другую ввиде ссылок.

    Так все-таки вставлять лист? Или работать с ссылками? Если дело только в ссылках, макросы не нужны.

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

    Почему бы и нет. Пиши название файла в отдельной ячейке, а на листе все формулы, ссылающиеся на лист, пиши в виде: =ДВССЫЛ(ячейка с названием) & нужная ячейка этого листа.
    Например:
    У нас есть файлы 1.xls, 2.xls и 3.xls. Нам нужно в файле 1.xls сделать ссылки на третий лист второй книги, потом заменить в ссылках вторую книгу на третью.
    В отдельной ячейке (например, A1) любого (например, третьего) листа первой книги создаем ссылку на третий лист второй книги: [2.xls]Лист3! (БЕЗ знака "=")
    А формулы в первой книге пишем в виде: =ДВССЫЛ(A1 & "ячейка_листа"), где A1 - ячейка со ссылкой на книгу, ячейка_листа - адрес ячейкй в указанной книге.
    Вот, собственно, и все. Теперь достаточно изменить адрес в ячейке A1 на [3.xls]Лист3!, чтобы адреса во всех ссылках поменялись.

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 12:31 29-12-2006
    giash



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

    Всего записей: 10 | Зарегистр. 18-12-2006 | Отправлено: 12:40 29-12-2006
    The okk



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

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 13:12 29-12-2006
    jONES1979



    Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    The okk
     
    может быть обрабатывать _BeforeSave в макросах. Завтра на трезвую голову подумаю-потестирую...

    Всего записей: 324 | Зарегистр. 20-05-2005 | Отправлено: 16:29 29-12-2006
    The okk



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    jONES1979
    Зачем? Если проблема только в ссылках, то формул вполне достаточно и не надо заморачиваться, поскольку формулы работают на порядки быстрее аналогичных конструкций VBA

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 20:15 29-12-2006
    jONES1979



    Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    The okk
    это про что ты?

    Всего записей: 324 | Зарегистр. 20-05-2005 | Отправлено: 00:30 30-12-2006
    Pazan



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    1. как с помощью VBA скопировать значение выделенной ячейки в буфер обмена?  
    2. как с помощью VBA удалить с файла всю личную информацию: автор, автор правки, версий и т.д.?
     


    ----------
    Почему глупый, потому что бедный... Почему бедный, потому что глупый...

    Всего записей: 924 | Зарегистр. 17-11-2002 | Отправлено: 09:59 30-12-2006
    jONES1979



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

    Цитата:
    1. как с помощью VBA скопировать значение выделенной ячейки в буфер обмена?  


    Код:
        Range("C7").Select
        Selection.Copy  

    Всего записей: 324 | Зарегистр. 20-05-2005 | Отправлено: 11:27 30-12-2006
    The okk



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

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 14:18 30-12-2006
    Pazan



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

    Цитата:
    Range("C7").Select  
        Selection.Copy  

    это я знаю, но оно копирует всю ячейку, включая форматирование и т.п., потому когда я из клипборда вставляю в Ворд/Райтер -- вставляэется вся ячейка. А мне нужно то что я делаю: нажимаю F2, выделяю текст, правой кнопкой "Копировать". тогда вставляется только знеформатированное значение

    ----------
    Почему глупый, потому что бедный... Почему бедный, потому что глупый...

    Всего записей: 924 | Зарегистр. 17-11-2002 | Отправлено: 15:51 30-12-2006
    SERGE_BLIZNUK

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Pazan
    Цитата:
    но оно копирует всю ячейку, включая форматирование и т.п.<...> А мне нужно то что я делаю: нажимаю F2, выделяю текст, правой кнопкой "Копировать". тогда вставляется только неформатированное значение
    Похоже, что чисто на Excel это нельзя сделать ;-(( получить неформатированное значение это проще простого (.Value) , а вот кинуть что-то в буфер обмена - проблема... Если уж очень надо (подчёркиваю ОЧЕНЬ - могу предложить крайне извращённый вариант через копирование в буфер обмена с помощью вызова через ShellExecute дополнительной программы (могу кинуть), задача которой будет просто помещать данные из командной строки в буфер обмена... но всё это крайне извратно...
     

    Всего записей: 2014 | Зарегистр. 12-09-2002 | Отправлено: 17:33 30-12-2006
    jONES1979



    Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    SERGE_BLIZNUK
     
    есть альтернативный, но тоже "ОТНОСИТЕЛЬНО" извратный вариант, копировать через explorer-объект. По крайней мере, его можно создать один глобальный и пользоваться.

    Код:
     
    strCopy = "This text has been copied to the clipboard."
     
    Set objIE = CreateObject("InternetExplorer.Application")
    objIE.Navigate("about:blank")
    objIE.document.parentwindow.clipboardData.SetData "text", strCopy
     ' objIE.Quit
     

    взято с ttp://www.microsoft.com/technet/scriptcenter/resources/qanda/aug04/hey0813.mspx

    Всего записей: 324 | Зарегистр. 20-05-2005 | Отправлено: 22:58 30-12-2006
    crewgehr

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Здрасьте!
    Всех с наступающим НГ!
    Можно ли оптимальнее записать код, который будет очищать значения в диапазоне из 2-х столбцов с определенным шагом? А ещё лучше, чтоб столбцы удалялись напрочь
     
    C1 = 6 ' 1st deleted column
    C2 = 7 ' 2nd deleted column
    R1 = 3 ' 1st row
    For C1 = 6 To 36 Step 3
          For R1 = 3 To 227
               For C2 = 7 To 37 Step 3
               Cells(R1, C1).ClearContents
               Cells(R1, C2).ClearContents
               Next C2
          Next R1
    Next C1
     

    Всего записей: 6 | Зарегистр. 19-12-2006 | Отправлено: 00:02 31-12-2006 | Исправлено: crewgehr, 01:45 31-12-2006
    SERGE_BLIZNUK

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

    Цитата:
    записать код, который будет очищать значения в диапазрне из 2-х столбцов  

    так как стобцы рядом и чистить их надо на одинаковую высоту, то конкретно ваш код можно оптимизировать так:

    Код:
     
    Sub ClearRange()
     R1 = 3
     R2 = 227
     For C1 = 6 To 36 Step 3
      Range(Cells(R1, C1), Cells(R2, C1 + 1)).ClearContents
     Next C1
    End Sub
     

    насчёт удаления столбцов, чуть подумать надо ;-))
     
    Добавлено:

    Код:
     
    Sub RemoveColumns()
    i = 0
    For C1 = 6 To 36 Step 3
      Columns(6 + i).Delete Shift:=xlToLeft
      Columns(6 + i).Delete Shift:=xlToLeft
      i = i + 1 ' поправка на то, что удаляем две колонки, а шаг = 3
    Next C1
    End Sub

    Обратите внимание, это только для вашего случая, в случае изменения порядка столбцов и/или изменения шага - функцию НАДО переделать! Да и спросить - уверен ли пользователь, что хочет безвозратно уфунькать хренову кучу столбцов - тоже не помешало бы - откат-то для VBA не работает...
    И подумать, можно ли защитить пользователя от его тупости (foolproof) - перед удалением проверить, есть ли в удалемых столбцах данные, по которым можно сказать, что удаление нажали в первый раз ( потому что, сколько раз запустишь, столько раз стобцы и поудаляет ;-)))
    Да, ещё для скорости можно добавить вначале Application.ScreenUpdating = False
    в конце Application.ScreenUpdating = True  

    Всего записей: 2014 | Зарегистр. 12-09-2002 | Отправлено: 01:48 31-12-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.B0ard
    © Ru.B0ard 2000-2024

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru