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

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



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Pantera3587
    Т.е. нужно находить значение по первым двум столбцам (фамилия и отдел)?

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 10:47 23-01-2007
    Pantera3587

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

    Всего записей: 40 | Зарегистр. 20-10-2006 | Отправлено: 12:02 23-01-2007
    The okk



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Pantera3587
    А почему нельзя просто сортировку включить (по двум первым столбцам) и подставить прямые ссылки?
    Сортировка как раз даст прямое соответствие.

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 15:13 23-01-2007 | Исправлено: The okk, 15:20 23-01-2007
    Yuk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Pantera3587
    Немного не по теме, но все же.
    А Вы исключаете наличие в одном отделе двух человек с одинаковой фамилией?

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 16:05 23-01-2007
    Pantera3587

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    The okk
     
    Я уже думала об этом, но дело в том , что таблицы на листах могут отличаться, т.е. в одной таблице на листе ЗП данных по строкам может быть больше, чем на листе КолЧас. Когда количество данных по строка совпадает, единственное что они могут быть разбросаны в хаотичном порядке, то проблем нет. Я уже это попробовала без макроса. В акцесе эта задача тоже очень легко решаема. А вот в экселе не могу придумать как выполнить эту задачу. В принципе нашала здесь один код:
     
    Sub СЦЕПИТЬ()
    Dim Rowcounter As Long
    With Selection
        For Rowcounter = 1 To .End(xlDown).Row
            If Len(.Cells(Rowcounter, 1)) = 0 Then
            Exit For
            End If
            .Cells(Rowcounter, 1) = .Cells(Rowcounter, 1) & "-" & _
            .Cells(Rowcounter, 2)
            Range(Cells(Rowcounter, 1), Cells(Rowcounter, 2)).Merge
        Next
    End With
    End Sub
    Т.е. мы как-бы из двух столбцов делаем один на одном листе и тоже самое на другом листе, но этот код во-первых, объединяет два столбца, нажав при этом мгного раз на кнопку ОК в открывающемся окне, т.е. если таблица содержит 100 строк, то инажать надо кнопку ОК 100 раз, во-вторых, после этого кода происходит объединение двух ячеек и сортировка в таком случае не работает. Надо снимать объединение. Хотя этот код можно было бы как-то применить, если бы он в первом столбце создавал текст из значений двух ячеек, но при этом не объединял бы их. Тогда можно применить сортировку, т.к. соединенные значения уже не будут совпадать.
     
    Добавлено:
    Yuk
    Вообще то не исключено, что в одном отделе может находится, например несколько Сидоровых. Наверное, тогда надо включать еще какой-нибудь столбец с данными, которые бы были отличны у одинаковых фамилий.
     
    Добавлено:
    The okk
    Кстати, этот код нашла у тебя на странице 55

    Всего записей: 40 | Зарегистр. 20-10-2006 | Отправлено: 16:21 23-01-2007
    SERGE_BLIZNUK

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Pantera3587
    Цитата:
    Вообще то не исключено, что в одном отделе может находится, например несколько Сидоровых. Наверное, тогда надо включать еще какой-нибудь столбец с данными, которые бы были отличны у одинаковых фамилий.  
    Уважаемая, а не проще будет добавить табельный номер, который по определению не может быть одинаков у разных людей (хоть в одном отделе, хоть в разных)!  И тогда ВПР решит вашу задачу...

    Всего записей: 2014 | Зарегистр. 12-09-2002 | Отправлено: 17:18 23-01-2007
    Pantera3587

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    SERGE_BLIZNUK
    Можно, но бывают таблицы с другими данными, где не может присутствовать табельный номер, например, такая на одном листе:
     
    Фамилия    КодА    КодАВ    СО    Значение
    иванов    Р142    Р1412    цо    350
    петров    Р142    Р1412    цо    0
    сидоров    Р142    Р1412    цо    0
    хомяков    Р142    Р1412    цо    0
     
    а на другом такая:
     
    Фамилия    КодА    КодАВ    СО    Значение1
    иванов    Р142    Р1412    цо    58
    петров    Р142    Р1412    цо    2
    сидоров    Р142    Р1412    цо    317
    хомяков    Р142    Р1412    цо    309
    иванов    Р142    Р1413    цо    450

    Всего записей: 40 | Зарегистр. 20-10-2006 | Отправлено: 17:35 23-01-2007
    SERGE_BLIZNUK

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Pantera3587
    не совсем понял, как у нас фамилия и отдел трансформировались в КодА КодАБ и т.д....
     
    поэтому кину решение (ну, на мой взгляд, методику или алгоритм решения)  первоначальной задачи:
     
    Как я понимаю, вам нужен только один дополнительный столбец -  
    на листе КолЧас в стобце A должна быть формула
      =СЦЕПИТЬ(Фамилия1;Отдел1)
     
    Тогда в любом (!!) месте, где вам нужно получить значение  
    Кол-ва часов
    (например, в то же листе ЗП вставляете формулу вида:
      =ВПР(СЦЕПИТЬ(Фамилия;Отдел);КолЧас!$A:$D;4;ЛОЖЬ)
    (разумеется, строчка вставки формулы должна соотвествовать фамилии/отделу)
     
    если это делать на новом листе (типа "Общий", то тогда туда надо
    перенести данные с листа ЗП (Фамилия, Отдел))  
    - это (перенос) можно сделать как макросом, так и (предпочтительнее),
    просто вставив формулы вида =Фамилия   =Отдел
    (ну, или ссылки на ячейки листа =ЗП!$A1)

    Всего записей: 2014 | Зарегистр. 12-09-2002 | Отправлено: 17:53 23-01-2007
    Yuk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Pantera3587
    Кстати, я когда-то писал функцию для поиска по нескольким полям. Два варианта вот здесь:
    http://forum.ru-board.com/topic.cgi?forum=5&topic=19106&start=380#7
    http://forum.ru-board.com/topic.cgi?forum=5&topic=19106&start=380#17
    Посмотри там обсуждение, может пригодится.

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 18:24 23-01-2007
    Pantera3587

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    SERGE_BLIZNUK
    То, что ты предлагаешь, не будет работать. Просто ты не можешь понять суть задачи. Просто сделай на одном листе (ЗП) таблицу:
    Петров    3 отдел    1500
    Сидоров    2 отдел    2000
    Иванов    3 отдел    2200
    Иванов    1 отдел    2500
    Петров    2 отдел    2500
    Петров    1 отдел    3500
     
    на другом листе (КолЧас) такую:
    Иванов    1 отдел    13
    Петров    1 отдел    10
    Петров    2 отдел    18
    Сидоров    2 отдел    20
    Иванов    3 отдел    9
     затем скопируй таблицу с первого листа на третий лист (Общая), а с листа КолЧас скопируй только третий столбец и вставь в лист Общая в четвертый столбец. Только скопирвать нужно так, чтобы, например, цифра 9 скопировалась на третью строчку, цифра 18 - на пятую.  
     
    Добавлено:
    Yuk
    Объясни, что нужно вводить в поле LookUp (смотреть?), что в From (вроде в переводе из) и что в Fist хотя бы на моем примере выше.

    Всего записей: 40 | Зарегистр. 20-10-2006 | Отправлено: 18:37 23-01-2007
    SERGE_BLIZNUK

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Pantera3587
    Цитата:
    То, что ты предлагаешь, не будет работать. Просто ты не можешь понять суть задачи
    Да понимаю я, что вы хотите.
    Давайте спокойно. Просто ответьте на очень простые вопросы:
    1) Возможно ли вставить на лист (КолЧас) дополнительный столбец A ?
    (там будет формула сцепления для поиска кол-ва часов)
    2) Обязательно ли требование, чтобы на листе (Общая) были не формулы/ссылки,
    а именно значения?
    3) Вам присать файлик XLS, который работает - т.е. на листе "Общая" данные - все четыре столбца обновляются сразу после добавления/измения/удаления данных в листах "ЗП" и "КолЧас" ?
     
    и последний вопрос - я ещё сам не глянул, то, что предложил Yuk, но, Вы уже посмотрели? Я догадываюсь, что он плохого не предложит ;-))
    Может быть, задача уже решена?
     

    Всего записей: 2014 | Зарегистр. 12-09-2002 | Отправлено: 19:34 23-01-2007
    Yuk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Pantera3587
    Там же практически все расписано.  
    1-й аргумент - что искать, например A2:B2 из 1-й таблицы. 2-й вариант функции позволяет использовать разделенные области, например А2,B3. В данном примере скорее всего не актуально.
    2-й - где искать. $A$2:$B$6 из 2-й таблицы
    3-й - не обязательный, если есть дупликаты, что выбирать.
    Функция возвращает номер строки из 2-й таблицы.
    Затем используем функцию ИНДЕКС для вытаскивания значения.

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 19:46 23-01-2007
    Pantera3587

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    SERGE_BLIZNUK
    1. Добавление столбца нежелательно, т.к. с добавление столбца эта задача решается легко.
    2. Именно значения
    3. желательно прислать файлик.
     
    Yuk
    Т.е. это должно выглядеть так?
    =MatchRange(ЗП!A1:B1;КолЧас!$A$1:$C$5;0)
    Эту функцию прописала на листе Общая в ячейке D1. Выдал #Error
    Т.к. выдает ошибку, то используя Индекс
    =ИНДЕКС(КолЧас!A1:C5;MatchRange(A1:B1;КолЧас!$A$1:$C$5;0);3)
    выдает Знач.

    Всего записей: 40 | Зарегистр. 20-10-2006 | Отправлено: 20:26 23-01-2007
    SERGE_BLIZNUK

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Pantera3587
    Цитата:
    =MatchRange(ЗП!A1:B1;КолЧас!$A$1:$C$5;0)  

    замените на  
    =MatchRange(ЗП!A1:B1;КолЧас!$A$1:$B$5;0)  
    всё заработает ;-)) (количество аргументов для поиска должно равняться количеству столбцов в области поиска).
    Однако, это не решает вашу задачу - так как вам нужны :
    Цитата:
    2. Именно значения  
    продолжаем разговор?... ;-))
     
     

    Всего записей: 2014 | Зарегистр. 12-09-2002 | Отправлено: 20:36 23-01-2007
    Yuk



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

    Цитата:
    Выдал #Error

    Потому что судя по 2-й таблице в 3-м отделе Петрова не числится.
    А здесь должно быть КолЧас!$A$1:$B$5 (не С).
    Цитата:
    число столбцов в обоих областях должно совпадать

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 20:39 23-01-2007
    SERGE_BLIZNUK

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    да, формулу индекса замените на
    Код:
    =ИНДЕКС(КолЧас!$A$1:$C$5;matchrange(A1:B1;КолЧас!$A$1:$B$5;0);3)

    Всего записей: 2014 | Зарегистр. 12-09-2002 | Отправлено: 20:41 23-01-2007
    Yuk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Или
    Код:
    =ИНДЕКС(КолЧас!$C$1:$C$5;matchrange(A1:B1;КолЧас!$A$1:$B$5;0);1)

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 20:48 23-01-2007
    SERGE_BLIZNUK

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Pantera3587
    Несмотря на то, что я считаю, что 1) задача уже решена и 2) формулы здесь быстрее, красивее и надежнее, тем не менее, скажу свою любимую фразу:
     Раз Вы задали вопрос в этом топике - получите программку  
    переноса данных Sub ZP_and_Hour_to_CommonList() Подробнее...
    Конечно, она очень неэффективная и не очень гибкая - но свою задачу решает.
    Удачи.
    p.s.Жду ваших комментариев.

    Всего записей: 2014 | Зарегистр. 12-09-2002 | Отправлено: 23:15 23-01-2007
    alin



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

    Код:
    Private Sub OK_Click()  
    Dim strDate As String  
    strDate = Format(Now(), "dd.mm")  
    If Sheets(1).Name <> strDate Then  
    ActiveSheet.Copy Before:=Sheets(1)  
    Sheets(1).Select  
    Sheets(1).Name = strDate  
    End If  
    Sheets(1).Select  
    Sheets(1).Name = strDate  
    Range("F3:AD25", "F27:AD31").ClearContents  
    Unload Me  
    End Sub
     

    Помогите, пожалуйста, советом. Каким образом можно избежать удаления данных, если лист с именем "dd.mm" уже существует. Например: UserForm закрывалась и появлялось предупреждение «Лист с таким именем уже есть!»

    Всего записей: 683 | Зарегистр. 05-08-2004 | Отправлено: 09:09 24-01-2007 | Исправлено: alin, 09:11 24-01-2007
    The okk



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    alin
    Цитата:
    Каким образом можно избежать удаления данных, если лист с именем "dd.mm" уже существует.


    Код:
    Sub Test(strDate As String)
    Dim wsList As Worksheet
        On Error Resume Next
        Set wsList = Worksheets(strDate)
        If Err <> 0 Then _
            strDate = InputBox("Лист с именем" & strDate & _
            " уже существует", "Ошибка", _
            "Введите другое имя")
        Call YourMacro(strDate As String)
    End Sub
     

    Если лист с именем strDate существует, будет предложено изменить strDate. Если не существует, то все, как обычно.
    Call YourMacro - вызов твоего макроса.
     
    P.S.: На будущее: самый быстрый способ узнать о наличии листа - попробовать обратиться к нему через Set и посмотреть, будет ли ошибка.

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 10:08 24-01-2007 | Исправлено: The okk, 10:11 24-01-2007
       

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