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

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

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Добрый всем день! прощу прощения за кросс-постинг, просто не уверен, что мой вопрос касается программирования
     
    Дело вот в чем - хочу зделать зависимые списки
     
    т.е. в одной ячейке есть список: IE, Firefox, Opera
    если юзер выбирает IE - в соседней ячейке появляется список: 6.0.2900; 6.0.2800; 6.0.2700
     
    Если выбрать Firefox - то там другие пункты соответственно
     
     
    объясните пожалуйста чайнику, как это проще всего сделать
    заранее спасибо

    Всего записей: 18 | Зарегистр. 12-03-2004 | Отправлено: 17:55 11-12-2006
    Yuk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Stasssm
    Замени Offset(0,-3) на Cells(fio.Row,2), что означает взять ячейку из той же строки, что у fio, и 2-го столбца.
     
     
    Добавлено:
    Radeon9800Pro
    Ну что ж. Коли не указано, как организовать списки, предложу сам.
    На отдельном листе (обзовем его list) сделать таблицу
    IE           Firefox   Opera
    6.0.2900 5.0         8
    6.0.2800 5.1         9
    6.0.2700
     
    Выделяем заголовок и обзываем эту область, скажем browser.
    Выделяем область со значениями под IE и обзываем ее IE.
    То же с остальными столбцами (имя области соответствует заголовку).
     
    В основном листе (где ячейки с выпадающими списками) предполагаем, что первый список в А1, второй в В1. Выделяем А1, Данные-->Проверка(Тип данных-Список), в формулу пишем =browser
    Затем в VBA редакторе в код основного листа вставляем код:
    Код:
    Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$A$1" Then
        Range("B1").Validation.Delete
        Range("B1").Validation.Add _
            Type:=xlValidateList, Formula1:="=" & Target.Value
        Range("B1").ClearContents
        Range("B1").Select
    End If
    End Sub

     
    Если все правильно сделано, должно заработать.

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 19:11 11-12-2006 | Исправлено: Yuk, 20:37 11-12-2006
    aalleexxaa



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Привет, нужна помощь
     
     1) нужно вывести из таблицы access один столбец причем все данные группировать, чтобы не было повторяющихся
     
    Код:
     
    Public db As DAO.Database
    Public tovar As DAO.Recordset
     
    Private Sub CButton2_Click()
    Set db = DAO.OpenDatabase(ThisWorkbook.Path + "\baza\baz.mdb")
    sSQL_t = "SELECT tovar.название FROM tovar GROUP BY tovar.название"
    Set tovar = db.OpenRecordset(sSQL_t)
     
    tovar.MoveLast
    d = tovar.RecordCount
    tovar.MoveFirst
     
    Do While Not tovar.EOF()
    For i = 1 To d
    Лист4.Cells(i, 2).Value = tovar.Fields(1)
    tovar.MoveNext
    Next i
    Loop
     
    tovar.Close
     
    End Sub

    что не правильно?  

    Всего записей: 16 | Зарегистр. 09-07-2006 | Отправлено: 20:44 11-12-2006
    Yuk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    aalleexxaa
    Используй запрос:
    "SELECT DISTINCT tovar.название FROM tovar"

    Цитата:
    что не правильно?

    А какие проблемы? Я ж не могу протестировать твой код без базы.

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 20:57 11-12-2006
    RDVAS

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

    Всего записей: 4 | Зарегистр. 11-12-2006 | Отправлено: 21:15 11-12-2006
    Yuk



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

    Код:
    Sub test()
    For Each ar In Selection.Areas
        Debug.Print ar.Address
    Next
    End Sub

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 21:26 11-12-2006
    RDVAS

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Yuk
    Огромное спасибо! Все идет

    Всего записей: 4 | Зарегистр. 11-12-2006 | Отправлено: 22:43 11-12-2006
    aalleexxaa



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Yuk
    действительно, что то я не подумал
    ошибка в том что он не видит
    Цитата:
    tovar.Fields(1)

     
    и кидает ошибку :
    Run-time error '3265' Aplication-defined or object-defined error
    как будто он не может обратится к таблице, хатя все правильно+все библиотеки

    Всего записей: 16 | Зарегистр. 09-07-2006 | Отправлено: 23:55 11-12-2006
    Yuk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    aalleexxaa
    Может надо tovar.Fields(0)?

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

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Есть список ФИО. В конце этого списка необходимо вставить количество печатных листов. Как найти это количество в VBA?

    Всего записей: 4 | Зарегистр. 11-12-2006 | Отправлено: 08:14 12-12-2006
    Yuk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    RDVAS
    Вроде так:
    Код:
    nPages = (ActiveSheet.HPageBreaks.Count + 1) * (ActiveSheet.VPageBreaks.Count + 1)


    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 09:06 12-12-2006
    Radeon9800Pro

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Yuk
    Спасибо огромное, все отлично работает! Можно я еще немного потуплю - а каким образом сделать два (или даже несколько) таких штук на одной странице?
     
    Добавлено:
    Yuk
    С предыдущим вопросом разобрался вроде сам, вот такой код работает:
    но появился еще один вопрос каким образом можно сделать, чтобы во всех последующих ячейках эта штука тоже работала
    т.е. у меня сейчас исходный список в F2, а зависимый - в G2
    и мне нужно, чтобы во всех F и G были эти списки
     
    (с оговорками - начиная со второй ячейки, и через каждые 10-15 строк (всегда по-разному) пропускать одну. Наверное, чтобы было понятно - нужен файл. Вот что я хочу в итоге получить:
    http://rapidshare.com/files/7179356/123456.rar.html
     

    Код:
     
     
    Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$F$2" Then
        Range("G2").Validation.Delete
        Range("G2").Validation.Add _
            Type:=xlValidateList, Formula1:="=" & Target.Value
        Range("G2").ClearContents
        Range("G2").Select
    End If
     
    If Target.Address = "$H$2" Then
        Range("I2").Validation.Delete
        Range("I2").Validation.Add _
            Type:=xlValidateList, Formula1:="=" & Target.Value
        Range("I2").ClearContents
        Range("I2").Select
    End If
     
    End Sub
     
     

    Всего записей: 18 | Зарегистр. 12-03-2004 | Отправлено: 14:59 12-12-2006 | Исправлено: Radeon9800Pro, 18:18 12-12-2006
    Stasssm

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Yuk
     
    СПАСИБО БОЛЬШОЕ, что откликнулись на мою проблемку - все получилось!
     
    Жаль, что нельзя пожать руку

    Всего записей: 109 | Зарегистр. 12-05-2006 | Отправлено: 18:24 12-12-2006
    Yuk



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

    Код:
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim tv As Validation
    If Target.Column = 6 Or Target.Column = 8 And HasValidation(Target) Then
        If Target.Value = "" Then
            Target.Offset(0, 1).ClearContents
            Exit Sub
        End If
        Target.Offset(0, 1).Validation.Delete
        Target.Offset(0, 1).Validation.Add _
            Type:=xlValidateList, Formula1:="=" & Target.Value
        Target.Offset(0, 1).ClearContents
        Target.Offset(0, 1).Select
    End If
    End Sub
     
    Private Function HasValidation(r As Range) As Boolean
    '   Returns True if every cell in Range r uses Data Validation
        On Error Resume Next
        x = r.Validation.Type
        If Err.Number = 0 Then HasValidation = True Else HasValidation = False
    End Function


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



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Yuk
    нет, нужно именно tovar.Fields(1) !!!
     

    Всего записей: 16 | Зарегистр. 09-07-2006 | Отправлено: 21:05 12-12-2006
    Yuk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    aalleexxaa
    Во-первых, откуда возьмется Fields(1), если запрос возвращает только одно поле? На забывай, что по умолчанию нумерация пунктов в колекции начинается с 0.
     
    А во-вторых тормоза мы оба
    Цитата:
    Лист4.Cells(i, 2).Value = tovar.Fields(1)

    Должно быть
    Код:
    Sheets("Лист4").Cells(i, 2).Value = tovar.Fields(0)


    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 21:54 12-12-2006
    aalleexxaa



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Yuk
    ты гений, ну наконец, я уже три дня сижу
     
    Добавлено:
    Подскажи мне еще один вопросец пожалуйста
     
    нужно при загрузке на лист вместо цифр поставить соответствующие названия из другой таблицы
     
    чтобы вывести на раб лист данные мы пишем:  

    Код:
    Cells(k, 7).Value = tovar.Fields(7)

    а чтобы заменить на соответствующие данные из другой таблицы:  

    Код:
    'Do While pol.EOF = False
    '    If pol.Fields(0).Value = tovar.Fields("код_пола").Value Then
    '    Cells(k, 7).Value = pol.Fields(1).Value
    '    End If
    '    pol.MoveNext
    '    Loop

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

    Код:
    Dim k As Integer
    k = 2
    With tovar
    tovar.MoveFirst
    Do While tovar.EOF = False
     
    Cells(k, 1).Value = tovar.Fields(0)    
    Cells(k, 2).Value = tovar.Fields(1)    
    Cells(k, 3).Value = tovar.Fields(3)    
    Cells(k, 4).Value = tovar.Fields(2)      
    Cells(k, 5).Value = tovar.Fields(5)      
    Cells(k, 6).Value = tovar.Fields(6)    
     
    'Cells(k, 7).Value = tovar.Fields(7)      
    Do While pol.EOF = False
        If pol.Fields(0).Value = tovar.Fields("код_пола").Value Then
        Cells(k, 7).Value = pol.Fields(1).Value
        End If
        pol.MoveNext
        Loop
       
    Cells(k, 8).Value = tovar.Fields(8)      
    Cells(k, 9).Value = tovar.Fields(9)    
    Cells(k, 10).Value = tovar.Fields(11)    
    Cells(k, 11).Value = tovar.Fields(10)    
    Cells(k, 12).Value = tovar.Fields(12)    
     
    tovar.MoveNext
    k = k + 1
    Loop
    End With

     
    но оно не переходит потом к следующей записи  
    если нужно база лежит тут

    Всего записей: 16 | Зарегистр. 09-07-2006 | Отправлено: 23:11 12-12-2006
    Yuk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    aalleexxaa
    А почему бы не извращаться, а сделать правильный запрос к базе.
    Насколько я понял, должно быть так:

    Код:
    SELECT tovar.код_товара, tovar.название, tovar.модель, tovar.код_поставщика, tovar.размер, tovar.код_сезона, pol.пол, tovar.код_цвета, tovar.каблук, tovar.цена, tovar.модельный_год, tovar.дата_поступления FROM pol INNER JOIN tovar ON pol.код_пола = tovar.код_пола;
     

    Либо создай запрос прямо в базе и обращайся к нему из экселя как к таблице (SELECT * FROM запрос), или используй код выше в макросе (у меня русские символы не работают, так что последний вариант не тестировал).
     
    Добавлено:
    А что касается твоего кода.
    После каждого цикла с pol надо его переводить на 1-ю запись
    pol.MoveFirst
    Возможно из-за этого и не работало.
    Кстати With у тебя не задействовано, можно выкинуть.

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 00:24 13-12-2006
    aalleexxaa



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Yuk
    еще раз огромное спасибки!  

    Всего записей: 16 | Зарегистр. 09-07-2006 | Отправлено: 08:49 13-12-2006
    The okk



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Не могу найти в object browser'е свойство ListBox'a, отвечающее за показ сетки. Не может же быть, что там сетка не включается!

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 12:01 13-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