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

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



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    felix25
    _http://msdn.microsoft.com/office/understanding/outlook/codesamples/default.aspx?pull=/library/en-us/dno2k3ta/html/odc_ac_olauto.asp#odc_ac_olauto_introduction
    В примере для Access, но думаю подойдет для любой програмы, использующей VBA.
    Sending an Outlook Mail Message Programmatically

    Всего записей: 3907 | Зарегистр. 31-03-2002 | Отправлено: 00:17 01-04-2006 | Исправлено: dneprcomp, 00:21 01-04-2006
    OchkaritO

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    aquaman77
     
    Отлично! Спасибо. Все работает, но новые вопросы не устают появляться...
     
    Вопрос певый: Необходимо чтобы наличие пустой строки (для вставки данных) проверялось только до столца J. В J и K буду выражения.
     
    И второй: можно ли сделать так, чтобы данные забирались не только из пятой строки, а из некоторого диапозона, величина диапозона строк не известна (~ до 15), и пустые строки на в ставлялись в лист DB?
     
    Такая вот мелочь для полного счастья...

    Всего записей: 19 | Зарегистр. 02-02-2006 | Отправлено: 10:15 03-04-2006 | Исправлено: OchkaritO, 13:18 03-04-2006
    Pahun78

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Надо создать алгоритм вычисления максимума целевой функции, которая выражает прибыль от вкладов в проекты. Задача линейного программирования в VBA Exel.
     
    Даны 3 объекта, их стоимость и годовой доход. Задача - сформировать макрос,  
    который бы расчитывал, сколько средств на какой проект надо вложить, чтобы получилась максимальная прибыль. Вот данные:  
    стоимость (млн):                  0  10    20   30    40    50    60    70  
    Год. доход от 1-го проекта: 0  1,6   3,1  4,5  5,8    7      8,1   9,1  
    Год. доход от 2-го проекта: 0  1,2   2,2  3     3,6    4      4,2   4,2  
    Год. доход от 3-го проекта: 0  2,8   5,3  7,5   9,4   11    12,3  13,3  
     
    Да, забыл - у компании есть всего 70 млн  
     
     
    --------------------------------------------------------------------------------
     
     
     
    Добавлено:
    Надо создать алгоритм вычисления максимума целевой функции, которая выражает прибыль от вкладов в проекты. Задача линейного программирования в VBA Exel.
     
    Даны 3 объекта, их стоимость и годовой доход. Задача - сформировать макрос,  
    который бы расчитывал, сколько средств на какой проект надо вложить, чтобы получилась максимальная прибыль. Вот данные:  
    стоимость (млн):                  0  10    20   30    40    50    60    70  
    Год. доход от 1-го проекта: 0  1,6   3,1  4,5  5,8    7      8,1   9,1  
    Год. доход от 2-го проекта: 0  1,2   2,2  3     3,6    4      4,2   4,2  
    Год. доход от 3-го проекта: 0  2,8   5,3  7,5   9,4   11    12,3  13,3  
     
    Да, забыл - у компании есть всего 70 млн  
     
     
    --------------------------------------------------------------------------------
     

    Всего записей: 17 | Зарегистр. 01-08-2005 | Отправлено: 13:40 04-04-2006
    Parsen



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Подскажите как макрос написать
    Задача такая: из другой программы вставляю данные-
         А       В
    1  ХХХ  0.444
    2  ХХХ  3.554
    нужно привести к такому виду:
         А       В
    1  ХХХ  0,444
    2  ХХХ  3,554
    т.е. точки заменить запятыми.
     
    Макрос в таком виде выполняется неправельно (заменяет если первая цифра "0", если не ноль то убирает и точку и запятую.
    Sub Макрос1()
        Range("В1:В20").Replace What:=".", Replacement:=","
    End Sub

    Всего записей: 23 | Зарегистр. 27-03-2005 | Отправлено: 17:24 04-04-2006
    Troitsky



    Водник Водкин
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Parsen
    А не проще будет поиграться с настройками разделителя целой и дробной части в Сервис/Параметры/Международные?
    Иначе можно с форматами представления значений ячеек умучаться ничего кроме непонимания не испытывая.

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

    Всего записей: 794 | Зарегистр. 13-12-2003 | Отправлено: 19:12 04-04-2006
    Parsen



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Troitsky
    Так работает, но это не выход. Не знаю как себя поведут формулы на другой машине.

    Всего записей: 23 | Зарегистр. 27-03-2005 | Отправлено: 19:32 04-04-2006
    Troitsky



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

    Цитата:
    Так работает, но это не выход. Не знаю как себя поведут формулы на другой машине.

    Должны нормально себя повести.
     
    А все, что ты считаешь результатом неправильной работы макроса, не инече как результат неверного истолкования форматов отображения и противоречие маждународных традиций разделения целой и дробной части числа.
    Проще вот такого вида цикл использовать:
    Код:
    For i = 1 To 20
      Cells(i, 2).Formula = Cells(i, 2).Text
    Next i
    Во всяком случае, результат более предсказуемый.

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

    Всего записей: 794 | Зарегистр. 13-12-2003 | Отправлено: 20:30 04-04-2006
    Parsen



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

    Всего записей: 23 | Зарегистр. 27-03-2005 | Отправлено: 21:23 04-04-2006
    felix25

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Help. Как в помощью VBA (или VB 6.0) скачивать информацию с Интернета?

    Всего записей: 2 | Зарегистр. 31-03-2006 | Отправлено: 14:12 19-04-2006
    Dixi257



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

    Цитата:
    Как в помощью VBA (или VB 6.0) скачивать информацию с Интернета?

     
    Вопрос очень уж объемный. Для начала посмотри сюда:
    http://vbnet.ru/samples/showgroup.aspx?id=7

    Всего записей: 128 | Зарегистр. 24-08-2005 | Отправлено: 15:59 19-04-2006
    Alexey Step

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Доброе время суток! Мне как начинающему тоже хочется помощи корифеев!  
    Есть проблема! Существует документ в Excel 2003 из 2 листов, 1лист для просмотра данных а на втором эти данные вводятся т.е. две таблицы. Задача: при вводе платижей в определеную ячейку на 2 листе на 1 листе нужно отобразить в соответствующей ячеке дату когда этот платеж был введен! И так по всей таблице ячейки совподают по строкам но не по столбикам. о-как!
     
    Сдесь на форуме я видел формулу предложенную "Anjin_Kazawa" примерно для похожей задачи  
     
    Private Sub Worksheet_Change(ByVal Target As Range)  
     S = UCase(CStr(Cells(Target.Row, Target.Column)))  
     If (S = "ВЫПОЛНЕННО") Or (S = "ГОТОВО") Then  
        Cells(Target.Row, 5) = Date$ + " " + Time$  
     End If  
    End Sub  
     
    Но как я не бился и не пробовал ее туда сюда ничего не получилось ПОМОГИТЕ!!! КТО МОЖЕТ!!! Могу прислать по эл. почте сам файл пишите stepanuk67@rambler.ru стучите ICQ 304364023 помогите выжить человеку!!!

    Всего записей: 4 | Зарегистр. 18-04-2006 | Отправлено: 16:20 19-04-2006 | Исправлено: Alexey Step, 16:22 19-04-2006
    DONRU1



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

    Всего записей: 32 | Зарегистр. 19-04-2006 | Отправлено: 20:57 19-04-2006
    ScorpionS



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Подскажите, как можно реализовать такую простую задумку в VBA.  
    Я хочу, чтобы в Excel если я ввожу какое-либо (любое) значение в ячейку А1, то у меня должны очищаться ячейки A2 и A3, если я ввожу какое-либо (любое) значение в ячейку А2, то у меня должны очищаться ячейки A1 и A3, и если я ввожу какое-либо (любое) значение в ячейку А3, то у меня должны очищаться ячейки A1 и A2. Вроде все просто, но не могу сразу понять как это сделать. Помогите, plz!  
     
    P.S. И может кто подскажет, где скачать справку к VB на РУССКОМ языке?

    Всего записей: 139 | Зарегистр. 24-02-2003 | Отправлено: 22:14 21-04-2006
    Yuk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ScorpionS
    B Sheet1 (Code):

    Код:
     
    Private Sub Worksheet_Change(ByVal Target As Range)
        Application.EnableEvents = False
        Select Case Target.Address
        Case "$A$1"
            Range("$A$2").Clear
            Range("$A$3").Clear
        Case "$A$2"
            Range("$A$1").Clear
            Range("$A$3").Clear
        Case "$A$3"
            Range("$A$1").Clear
            Range("$A$2").Clear
        End Select
        Application.EnableEvents = True
    End Sub
     


    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 01:04 22-04-2006
    ScorpionS



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Yuk
    Дружище, спасибо! Вроде сработывает!
    Подскажите как реализовать еще одну идею.
    Нужно, чтобы при вводе в Ячейку A1 любого значения, отличного от 0, 10 или 20 (а также кроме пустоты, т.е. при очистке ячейки) выскакивал MessageBox с текстом собщение "Текс сообщения" и кнопкой OK, после нажатия на которую нужно вернутся на эту ячейку.

    Всего записей: 139 | Зарегистр. 24-02-2003 | Отправлено: 17:57 22-04-2006 | Исправлено: ScorpionS, 19:49 22-04-2006
    Yuk



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

    Код:
     
    Private Sub Worksheet_Change(ByVal Target As Range)
        Application.EnableEvents = False
        Select Case Target.Address
        Case "$A$1"
            Range("$A$2").Clear
            Range("$A$3").Clear
            If Target.Value <> 0 And _
               Target.Value <> 10 And _
               Target.Value <> 20 And _
               Target.Value <> "" Then
               MsgBox "Текс сообщения"
               Target.Select
            End If
        Case "$A$2"
            Range("$A$1").Clear
            Range("$A$3").Clear
        Case "$A$3"
            Range("$A$1").Clear
            Range("$A$2").Clear
        End Select
        Application.EnableEvents = True
    End Sub
     

    Возможно, можно описать условие покороче, ну да если работает, то и ладно.
    А, например, для 30, 40, ... нужен MessageBox?
    А если ввести 0, 10, 20 как текст? ('0)

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 07:53 23-04-2006
    ScorpionS



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Yuk
    Спасибо!
    Слушай, а если нужно мне указать не явное число, а ячейки A10, A11 и A12, в которых 0, 10 и 20 соответственно (и эти ячейки имеют формат числовой). При этом строку

    Код:
     
             If Target.Value <> 0 And _  
     

    я пытаюсь записать в каждом из трех видов по очереди

    Код:
     
    1.
            If Target.Value <> "$A$10" And _  
    2.
            If Target.Value <> "A10" And _  
    3.
            If Target.Value <> A10 And _  
     

    Ни одна из этих трех записей не срабатывает. Почему не знаешь?
     
     
     
     

    Всего записей: 139 | Зарегистр. 24-02-2003 | Отправлено: 12:22 24-04-2006 | Исправлено: ScorpionS, 12:23 24-04-2006
    Yuk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ScorpionS
    Target.Value - это значение ячейки. Ты же пытаешься сравнивать его с адресом ячейки. Используй Target.Address, значение которого всегда абсолютный адрес, типа $A$10.
     
    Вообще, Target - это переменная данной функции, которая передает в нее ячейку(и), в которой произошло изменение.
    Для твоего примера

    Код:
     
    If Target.Value <> Range("$A$10").Value Then
     


    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 18:11 24-04-2006
    ScorpionS



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

    Всего записей: 139 | Зарегистр. 24-02-2003 | Отправлено: 18:42 24-04-2006
    ScorpionS



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

    Код:
     
        Case "$A$1"  
     

    вместо "$A$1" сделать ссылку на ячейку на другом листе, допустим Лист2, ячейка D12? Или нельзя сравнивать ячейку на другом листе?
     
    И еще один вопрос. Я хочу чтобы если значение в ячейке C89 на листе "Формулы" = 1, чтобы строки с 4 по 7 на листе "Досье" были скрыты, при значении = 2, чтобы строка 4 была отображена, а строки с 5 по 7 на листе "Досье" были скрыты, при значении = 3, чтобы строки 4 и 5 былы отображены, а строки с 6 по 7 на листе "Досье" были скрыты, при значении = 4, чтобы строки с 4 по 6 былы отображены, а строка 7 на листе "Досье" была скрыта и при значении = 5, чтобы строки с 4 по 7 былы отображены.
    Пишу такой код

    Код:
     
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
     If Sheets("Формулы").Cells(89, 3).Value = 1 Then
      Rows("4:7").Select
      Selection.EntireRow.Hidden = True
      Range("F3").Select
     End If
     If Sheets("Формулы").Cells(89, 3).Value = 2 Then
      Rows("5:7").Select
      Selection.EntireRow.Hidden = True
      Rows("4:4").Select
      Selection.EntireRow.Hidden = False
      Range("F3").Select
     End If
     If Sheets("Формулы").Cells(89, 3).Value = 3 Then
      Rows("4:5").Select
      Selection.EntireRow.Hidden = False
      Rows("6:7").Select
      Selection.EntireRow.Hidden = True
      Range("F3").Select
     End If
     If Sheets("Формулы").Cells(89, 3).Value = 4 Then
      Rows("4:6").Select
      Selection.EntireRow.Hidden = False
      Rows("7:7").Select
      Selection.EntireRow.Hidden = True
      Range("F3").Select
     End If
     If Sheets("Формулы").Cells(89, 3).Value = 5 Then
      Rows("4:7").Select
      Selection.EntireRow.Hidden = False
      Range("F3").Select
     End If
    End Sub
     

    Но у меня попадает в какой-то цикл, например, при значении 2 на строке

    Код:
     
      Rows("5:7").Select
     

    Всего записей: 139 | Зарегистр. 24-02-2003 | Отправлено: 14:17 25-04-2006 | Исправлено: ScorpionS, 14:51 25-04-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.Board
    © Ru.Board 2000-2018

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru

    Рейтинг.ru