Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 17.01.2009, 20:10   #1
maxic
Пользователь
 
Аватар для maxic
 
Регистрация: 10.09.2008
Сообщений: 37
По умолчанию Ячейка как список (через VBA)

Добрый день. У меня два вопроса.

Первый: Подскажите, пожалуйста, как правильно прописать (программно), что значение ячейки есть список (Данные – Проверка - Список).

И второй вопрос относительно выделения ячеек в цикле.
Есть цикл:
Do While i < 27
nn = "C" + Trim(Str(i))
Range (nn).Select
Loop

Судя по реакции Excel, это полная нелепица… и nn просто не имеет права быть строковой переменной. Дайте совет знатока, как через Range () правильно выделять ячейки в цикле.

Последний раз редактировалось maxic; 17.01.2009 в 20:15.
maxic вне форума
Старый 17.01.2009, 20:30   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
как правильно прописать (программно), что значение ячейки есть список
Код:
Sub AddValidationList(ByRef ce As Range)
    With ce
        .HorizontalAlignment = xlCenter    ' выравнивание

        With .Validation    ' формируем выпадающий список
            .Delete
            .Add Type:=xlValidateList, AlertStyle:=xlValidAlertInformation, Operator:= _
                 xlBetween, Formula1:=ce.Value & ", Выполнено, Не выполнено"
            .IgnoreBlank = True: .InCellDropdown = True
        End With

        ' условное форматирование
        .FormatConditions.Delete
        .FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, Formula1:="=""Выполнено"""
        .FormatConditions(1).Interior.ColorIndex = 35    '4
        .FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, Formula1:="=""Не выполнено"""
        .FormatConditions(2).Interior.ColorIndex = 38    '3
    End With
End Sub


Sub test()    ' пример использования
    Dim cell As Range
    For Each cell In [a2:e5]    ' для всех ячеек диапазона a2:e5
        AddValidationList cell
    Next
End Sub
Запустите макрос test, а потом посмотрите, что получилось в указанных ячейках.



Цитата:
второй вопрос относительно выделения ячеек в цикле
Например, так:
Код:
Sub test2()
    i = 1    ' задаём начальное значение
    Do While i < 27
        nn = "C" + Trim(str(i))
        Range(nn).Select
        i = i + 1 ' не забываем увеличивать счетчик
    Loop
End Sub
А лучше так:
Код:
Sub test2()
    For i = 1 To 27
        Cells(i, 3).Select
    Next
End Sub
Вот только зачем выделять ячейки в цикле ???????
Визуальные эффекты при работе макроса нужны?

Для работы с ячейками их совсем не обязательно выделять.
Что Вы пытаетесь сделать при помощи этого кода?

Последний раз редактировалось EducatedFool; 17.01.2009 в 20:39.
EducatedFool вне форума
Старый 17.01.2009, 23:09   #3
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Цитата:
Do While i < 27
nn = "C" + Trim(Str(i))
Range (nn).Select
Loop
Судя по реакции Excel, это полная нелепица
не согласен с последним утверждением, для экселя - это вполне нормальный код. Вот смысл этого цикла и корректность его выполнения действительно вызывают сомнения. 2 ошибки указал EducatedFool. Реакция эксель, видимо, была таковой: остановка выполнения по ошибке 1004. Не известно значение i на входе в цикл, но можно предположить, что оно равно 0. Если это так, то 1004 ошибка - самая правильная реакция на ваш код.

Цитата:
и nn просто не имеет права быть строковой переменной
абосолютно ошибочное утверждение. еще как может. Выполните цикл подправленный EducatedFool и увидите это. Только результатом работы этого цикла будет поочередно отмеченные ячейки начиная с С1 и заканчивая С27. У меня возникло предположение, что вы хотели отметить 27 первых ячеек колонки С. Это можно было сделать одной строкой Range("C1:C27").Select. Можете убедиться, что переданная в Range строка "C1:C5" приводит к правильному выполнению метода Select.

Цитата:
Дайте совет знатока, как через Range () правильно выделять ячейки в цикле.
Подозреваю, что этот вопрос потерял актуальность в вашей конкретной задаче, но если необходимо в том же диапазоне отметить все непарные ячейки предлагаю предварительно собрать их имена в строку:

Код:
Sub НепарныеКолонкаС_с_1_по_27()
  Dim ar As String, i As Integer
  ar = ""
  For i = 1 To 27
      If i Mod 2 = 1 Then ar = ar & Cells(i, 3).Address(False, False) & ","
  Next
  ar = Left(ar, Len(ar) - 1)
  Range(ar).Select
End Sub
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума
Старый 21.01.2009, 17:09   #4
maxic
Пользователь
 
Аватар для maxic
 
Регистрация: 10.09.2008
Сообщений: 37
По умолчанию

Большое спасибо EducatedFool и IgorGO за внимание к теме и дельные советы!

Теперь по теме:
Цитата:
Что Вы пытаетесь сделать при помощи этого кода?
Существует файл с двумя листами "Main" и "Data". Необходимо заполнить лист "Data", анализируя данные ячеек "Main".

Код:
i_name = ActiveWorkbook.Name
Do While Workbooks(i_name).Sheets("Main").Cells(i, 7).value <> "Контрагент1"
   If Workbooks(i_name).Sheets("Main").Cells(i, 1).value = "AEROLA" Then
             Workbooks(i_name).Sheets("Data").Cells(i, 3).value = Workbooks(i_name).Sheets("Main").Cells(i, 7).value
             Workbooks(i_name).Sheets("Data").Cells(i, 4).value = Workbooks(i_name).Sheets("Main").Cells(i, 9).value
             Workbooks(i_name).Sheets("Data").Cells(i, 5).value = "%"
             np = "N" + Trim(Str(i))
             Workbooks(i_name).Sheets("Data").Cells(np).Select
                 With Selection.Validation
                     .Delete
                     .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
                      xlBetween, Formula1:="=Изделие_описание"
                     .IgnoreBlank = True
                    .InCellDropdown = True
                   End With
              Workbooks(i_name).Sheets("Data").Cells(i, 13).Select
                ActiveCell.FormulaR1C1 = "=VLOOKUP(RC[1],Изделия,2,0)"
              Workbooks(i_name).Sheets("Data").Cells(i, 15).value = ""
              Workbooks(i_name).Sheets("Data").Cells(i, 16).value = Workbooks(i_name).Sheets("Main").Cells(i, 37).value
   Else 
              'Иные значения ячеек листа "Data"
   End If
i = i + 1
Loop
ошибка 13 "Type mismatch" выдается на строке:
Код:
Workbooks(i_name).Sheets("Data").Cells(np).Select
получилось обойти только явным указанием:
Код:
Workbooks(i_name).Sheets("Data").Cells(i, 14).Select
наверное, есть объяснение почему...
и еще мне не совсем понятно в строке (записывалось макросом)
Код:
 ActiveCell.FormulaR1C1 = "=VLOOKUP(RC[1],Изделия,2,0)"
RC[1]- это взаимное расположение ячеек?
не подскажете литературу по кодированию формул
maxic вне форума
Старый 22.01.2009, 06:17   #5
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
ошибка 13 "Type mismatch" выдается на строке:
Workbooks(i_name).Sheets("Data").Ce lls(np).Select

получилось обойти только явным указанием:
Workbooks(i_name).Sheets("Data").Ce lls(i, 14).Select
Попробуйте так:
Workbooks(i_name).Sheets("Data").Range(np).Select

Пример обращения к ячейкам:
Код:
Sub test()
    'Cells("e1").Select ' не работает
    Cells(1, "e").Select    ' работает
    Range("e1").Select    ' работает
End Sub

Ваш код можно записать таким образом:
Код:
Sub test3()
    Dim shM As Worksheet: Set shM = ActiveWorkbook.Sheets("Main")
    Dim shD As Worksheet: Set shD = ActiveWorkbook.Sheets("Data")

    i = 1
    With shD
        Do While shM.Cells(i, 7).Value <> "Контрагент1"
            If shM.Cells(i, 1).Value = "AEROLA" Then
                .Cells(i, 3).Value = shM.Cells(i, 7).Value
                .Cells(i, 4).Value = shM.Cells(i, 9).Value
                .Cells(i, 5).Value = "%"

                With .Cells(i, "N").Validation
                    .Delete
                    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
                         xlBetween, Formula1:="=Изделие_описание"
                    .IgnoreBlank = True: .InCellDropdown = True
                End With
                .Cells(i, 13).FormulaR1C1 = "=VLOOKUP(RC[1],Изделия,2,0)"
                .Cells(i, 15).Value = ""
                .Cells(i, 16).Value = shM.Cells(i, 37).Value
            Else
                'Иные значения ячеек листа "Data"
            End If
            i = i + 1
        Loop
    End With
End Sub
Цитата:
RC[1]- это взаимное расположение ячеек?
Да. RC[1] - это ссылка на ячейку, расположенную справа (в следующем столбце) от ячейки, в которую вводится формула
EducatedFool вне форума
Старый 23.01.2009, 00:10   #6
maxic
Пользователь
 
Аватар для maxic
 
Регистрация: 10.09.2008
Сообщений: 37
По умолчанию

Спасибо

Цитата:
Workbooks(i_name).Sheets("Data").Ra nge(np).Select
Должна признать, что использовать Range не додумалась...
maxic вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
реализация стека через односвязный список snusnu Общие вопросы C/C++ 7 06.04.2014 23:59
Выбор данных с листов через выпадающий список DimDimos Microsoft Office Excel 5 17.12.2008 11:27
Ячейка не меньше 1000 mirawoo Microsoft Office Excel 2 24.10.2008 11:04
Помогите плз, нужна плавающая ячейка linitz Microsoft Office Excel 7 19.09.2008 13:34