Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Цикл For для переменных - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Цикл For для переменных (Макросы/Sub)
Цикл For для переменных
rever27 Дата: Понедельник, 20.07.2015, 09:03 | Сообщение № 1
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 141
Репутация: 0 ±
Замечаний: 20% ±

Excel 2010
Есть разные переменные (А1-А8), которые отвечают каждая за свой столбец.

[vba]
Код
          If A1 = "" Then .SortFields.Add A1, xlSortOnValues, OrderSwitch, xlSortNormal
          If A2 = "" Then .SortFields.Add A2, xlSortOnValues, OrderSwitch, xlSortNormal
          If A3 = "" Then .SortFields.Add A3, xlSortOnValues, OrderSwitch, xlSortNormal
          If A4 = "" Then .SortFields.Add A4, xlSortOnValues, OrderSwitch, xlSortNormal
          If A5 = "" Then .SortFields.Add A5, xlSortOnValues, OrderSwitch, xlSortNormal
          If A6 = "" Then .SortFields.Add A6, xlSortOnValues, OrderSwitch, xlSortNormal
          If A7 = "" Then .SortFields.Add A7, xlSortOnValues, OrderSwitch, xlSortNormal
          If A8 = "" Then .SortFields.Add A8, xlSortOnValues, OrderSwitch, xlSortNormal
[/vba]

Как можно упростить этот код через цикл For?
Данные конструкция у меня отказывается работать, возможно нужно задать тип переменной...
[vba]
Код
For i = 1 To 8
If ("A" & i) = "" Then .SortFields.Add ("A" & i), xlSortOnValues, OrderSwitch, xlSortNormal
Next
[/vba]
 
Ответить
СообщениеЕсть разные переменные (А1-А8), которые отвечают каждая за свой столбец.

[vba]
Код
          If A1 = "" Then .SortFields.Add A1, xlSortOnValues, OrderSwitch, xlSortNormal
          If A2 = "" Then .SortFields.Add A2, xlSortOnValues, OrderSwitch, xlSortNormal
          If A3 = "" Then .SortFields.Add A3, xlSortOnValues, OrderSwitch, xlSortNormal
          If A4 = "" Then .SortFields.Add A4, xlSortOnValues, OrderSwitch, xlSortNormal
          If A5 = "" Then .SortFields.Add A5, xlSortOnValues, OrderSwitch, xlSortNormal
          If A6 = "" Then .SortFields.Add A6, xlSortOnValues, OrderSwitch, xlSortNormal
          If A7 = "" Then .SortFields.Add A7, xlSortOnValues, OrderSwitch, xlSortNormal
          If A8 = "" Then .SortFields.Add A8, xlSortOnValues, OrderSwitch, xlSortNormal
[/vba]

Как можно упростить этот код через цикл For?
Данные конструкция у меня отказывается работать, возможно нужно задать тип переменной...
[vba]
Код
For i = 1 To 8
If ("A" & i) = "" Then .SortFields.Add ("A" & i), xlSortOnValues, OrderSwitch, xlSortNormal
Next
[/vba]

Автор - rever27
Дата добавления - 20.07.2015 в 09:03
SLAVICK Дата: Понедельник, 20.07.2015, 09:28 | Сообщение № 2
Группа: Модераторы
Ранг: Старожил
Сообщений: 2290
Репутация: 766 ±
Замечаний: 0% ±

2019
Конечно не будет работать, ВБА не понимает "склеенные переменные"
Чтобы работало как Вы хотите нужно использовать либо массив, либо словарь или коллекцию, и т.д. :D
Так из кода ничего не понятно - где и как Вы присваиваете эти переменные?
Положите файл-пример <_<


Иногда все проще чем кажется с первого взгляда.
 
Ответить
СообщениеКонечно не будет работать, ВБА не понимает "склеенные переменные"
Чтобы работало как Вы хотите нужно использовать либо массив, либо словарь или коллекцию, и т.д. :D
Так из кода ничего не понятно - где и как Вы присваиваете эти переменные?
Положите файл-пример <_<

Автор - SLAVICK
Дата добавления - 20.07.2015 в 09:28
_Boroda_ Дата: Понедельник, 20.07.2015, 09:31 | Сообщение № 3
Группа: Модераторы
Ранг: Местный житель
Сообщений: 16675
Репутация: 6481 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
Что-то типа вот этого, так, на скорую руку написал, разберетесь, как к себе переделать?
[vba]
Код
    Dim ar
     ar = Range("A2:H2").Value
     For i = 1 To 8
         If ar(1, i) = "" Then Cells(3, i) = 1
     Next i
[/vba]


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеЧто-то типа вот этого, так, на скорую руку написал, разберетесь, как к себе переделать?
[vba]
Код
    Dim ar
     ar = Range("A2:H2").Value
     For i = 1 To 8
         If ar(1, i) = "" Then Cells(3, i) = 1
     Next i
[/vba]

Автор - _Boroda_
Дата добавления - 20.07.2015 в 09:31
rever27 Дата: Понедельник, 20.07.2015, 10:43 | Сообщение № 4
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 141
Репутация: 0 ±
Замечаний: 20% ±

Excel 2010
_Boroda_, немного не то, т.к. А1 переменная и равна: A1 = [B1] и т.д.
Файл примера приложить не получилось, ибо состоит из кучи сторонних макросов, разъединить не получилось )

Раз переменные склеить нельзя, то и вопрос мой отпадает. Спасибо
 
Ответить
Сообщение_Boroda_, немного не то, т.к. А1 переменная и равна: A1 = [B1] и т.д.
Файл примера приложить не получилось, ибо состоит из кучи сторонних макросов, разъединить не получилось )

Раз переменные склеить нельзя, то и вопрос мой отпадает. Спасибо

Автор - rever27
Дата добавления - 20.07.2015 в 10:43
_Boroda_ Дата: Понедельник, 20.07.2015, 10:49 | Сообщение № 5
Группа: Модераторы
Ранг: Местный житель
Сообщений: 16675
Репутация: 6481 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
А1 переменная и равна: A1 = [B1] и т.д.

А я Вам это и написал.
Только переменная не А1, а ar(1,1), ar(1,2) и т.д. Ну можете обозвать не ar, а A, кто ж Вам мешает-то?
И строку [vba]
Код
ar = Range("A2:H2").Value
[/vba]переписать
[vba]
Код
ar = Range("B1:B8").Value
[/vba]


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
Сообщение
А1 переменная и равна: A1 = [B1] и т.д.

А я Вам это и написал.
Только переменная не А1, а ar(1,1), ar(1,2) и т.д. Ну можете обозвать не ar, а A, кто ж Вам мешает-то?
И строку [vba]
Код
ar = Range("A2:H2").Value
[/vba]переписать
[vba]
Код
ar = Range("B1:B8").Value
[/vba]

Автор - _Boroda_
Дата добавления - 20.07.2015 в 10:49
SLAVICK Дата: Понедельник, 20.07.2015, 11:16 | Сообщение № 6
Группа: Модераторы
Ранг: Старожил
Сообщений: 2290
Репутация: 766 ±
Замечаний: 0% ±

2019
off_top
_Boroda_, может я ошибаюсь, но по моему есть нарушение Пункта 3 правил форума.
Общие ответы, как это сделать уже дали.
Вы, получается, дальше помогаете без конкретного примера :o
Мы же не знаем, где и когда объявляются переменные :)

[moder]Было разъяснение Сергея его понимания политики по поводу приложения файла-примера. Поищите.
Это не мое мнение, более того, я с ним не согласен, но хозяин сайта он.


Иногда все проще чем кажется с первого взгляда.

Сообщение отредактировал _Boroda_ - Понедельник, 20.07.2015, 11:22
 
Ответить
Сообщениеoff_top
_Boroda_, может я ошибаюсь, но по моему есть нарушение Пункта 3 правил форума.
Общие ответы, как это сделать уже дали.
Вы, получается, дальше помогаете без конкретного примера :o
Мы же не знаем, где и когда объявляются переменные :)

[moder]Было разъяснение Сергея его понимания политики по поводу приложения файла-примера. Поищите.
Это не мое мнение, более того, я с ним не согласен, но хозяин сайта он.

Автор - SLAVICK
Дата добавления - 20.07.2015 в 11:16
rever27 Дата: Понедельник, 20.07.2015, 11:32 | Сообщение № 7
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 141
Репутация: 0 ±
Замечаний: 20% ±

Excel 2010
Товарищи, вот файл примера

Там 2 макроса, отвечающие за сортировку по столбцам R и S. И один общий макрос для выполнения данной сортировки. Все так усложнено, потому что для каждой сортировки нужна определенная последовательность столбцов.
Вопрос же остается прежним. Как визуально улучшить вид макроса, сократив перечень повторяющихся операций?
К сообщению приложен файл: 11.xlsm (27.4 Kb)
 
Ответить
СообщениеТоварищи, вот файл примера

Там 2 макроса, отвечающие за сортировку по столбцам R и S. И один общий макрос для выполнения данной сортировки. Все так усложнено, потому что для каждой сортировки нужна определенная последовательность столбцов.
Вопрос же остается прежним. Как визуально улучшить вид макроса, сократив перечень повторяющихся операций?

Автор - rever27
Дата добавления - 20.07.2015 в 11:32
Саня Дата: Понедельник, 20.07.2015, 11:58 | Сообщение № 8
Группа: Друзья
Ранг: Ветеран
Сообщений: 1068
Репутация: 560 ±
Замечаний: 0% ±

XL 2016
предложу так:

[vba]
Код
'Dim A1, A2, A3, A4, A5, A6, A7, A8, A9
Sub b_Sort_Settings(ParamArray aSortKeys())    'Общая сортировка значений (Не работает отдельно)

     If Selection.Count > 20 Then
         If SortSwitch = False Then SortSwitch = True Else SortSwitch = False
     Else: If Selection.Count = 1 Then SortSwitch = False
     End If

     If SortSwitch = True Then OrderSwitch = xlDescending Else OrderSwitch = xlAscending

     Range(Cells(ActiveCell.Row, 2), Cells(ActiveCell.Row, Columns.Count).End(xlToLeft).End(xlDown)).Select
     With ActiveSheet.Sort
         .SortFields.Clear

         For i = 0 To UBound(aSortKeys)
             If TypeName(aSortKeys(i)) = "Range" Then
                 .SortFields.Add aSortKeys(i), xlSortOnValues, OrderSwitch, xlSortNormal
             End If
         Next i
         '        If A1 = "" Then .SortFields.Add A1, xlSortOnValues, OrderSwitch, xlSortNormal
         '        If A2 = "" Then .SortFields.Add A2, xlSortOnValues, OrderSwitch, xlSortNormal
         '        If A3 = "" Then .SortFields.Add A3, xlSortOnValues, OrderSwitch, xlSortNormal
         '        If A4 = "" Then .SortFields.Add A4, xlSortOnValues, OrderSwitch, xlSortNormal
         '        If A5 = "" Then .SortFields.Add A5, xlSortOnValues, OrderSwitch, xlSortNormal
         '        If A6 = "" Then .SortFields.Add A6, xlSortOnValues, OrderSwitch, xlSortNormal
         '        If A7 = "" Then .SortFields.Add A7, xlSortOnValues, OrderSwitch, xlSortNormal
         '        If A8 = "" Then .SortFields.Add A8, xlSortOnValues, OrderSwitch, xlSortNormal
         '        If A9 = "" Then .SortFields.Add A9, xlSortOnValues, xlDescending, xlSortNormal
         .SetRange Selection
         .Apply
     End With

     '    A1 = "": A2 = "": A3 = "": A4 = "": A5 = "": A6 = "": A7 = "": A8 = "": A9 = ""

End Sub
Sub b_Sort_R()    'Сортировка по столбцу R
     '    Set A1 = [R1]: Set A2 = [Q1]: Set A3 = [U1]: A4 = "NO": A5 = "NO": A6 = "NO": A7 = "NO": A8 = "NO": A9 = "NO": b_Sort_Settings
     b_Sort_Settings [R1], [Q1], [U1]
End Sub
Sub b_Sort_S()    'Сортировка по столбцу S
     '    Set A1 = [S1]: Set A2 = [Q1]: Set A3 = [M1]: A4 = "NO": A5 = "NO": A6 = "NO": A7 = "NO": A8 = "NO": A9 = "NO": b_Sort_Settings
     b_Sort_Settings [S1], [Q1], [M1]
End Sub
[/vba]
 
Ответить
Сообщениепредложу так:

[vba]
Код
'Dim A1, A2, A3, A4, A5, A6, A7, A8, A9
Sub b_Sort_Settings(ParamArray aSortKeys())    'Общая сортировка значений (Не работает отдельно)

     If Selection.Count > 20 Then
         If SortSwitch = False Then SortSwitch = True Else SortSwitch = False
     Else: If Selection.Count = 1 Then SortSwitch = False
     End If

     If SortSwitch = True Then OrderSwitch = xlDescending Else OrderSwitch = xlAscending

     Range(Cells(ActiveCell.Row, 2), Cells(ActiveCell.Row, Columns.Count).End(xlToLeft).End(xlDown)).Select
     With ActiveSheet.Sort
         .SortFields.Clear

         For i = 0 To UBound(aSortKeys)
             If TypeName(aSortKeys(i)) = "Range" Then
                 .SortFields.Add aSortKeys(i), xlSortOnValues, OrderSwitch, xlSortNormal
             End If
         Next i
         '        If A1 = "" Then .SortFields.Add A1, xlSortOnValues, OrderSwitch, xlSortNormal
         '        If A2 = "" Then .SortFields.Add A2, xlSortOnValues, OrderSwitch, xlSortNormal
         '        If A3 = "" Then .SortFields.Add A3, xlSortOnValues, OrderSwitch, xlSortNormal
         '        If A4 = "" Then .SortFields.Add A4, xlSortOnValues, OrderSwitch, xlSortNormal
         '        If A5 = "" Then .SortFields.Add A5, xlSortOnValues, OrderSwitch, xlSortNormal
         '        If A6 = "" Then .SortFields.Add A6, xlSortOnValues, OrderSwitch, xlSortNormal
         '        If A7 = "" Then .SortFields.Add A7, xlSortOnValues, OrderSwitch, xlSortNormal
         '        If A8 = "" Then .SortFields.Add A8, xlSortOnValues, OrderSwitch, xlSortNormal
         '        If A9 = "" Then .SortFields.Add A9, xlSortOnValues, xlDescending, xlSortNormal
         .SetRange Selection
         .Apply
     End With

     '    A1 = "": A2 = "": A3 = "": A4 = "": A5 = "": A6 = "": A7 = "": A8 = "": A9 = ""

End Sub
Sub b_Sort_R()    'Сортировка по столбцу R
     '    Set A1 = [R1]: Set A2 = [Q1]: Set A3 = [U1]: A4 = "NO": A5 = "NO": A6 = "NO": A7 = "NO": A8 = "NO": A9 = "NO": b_Sort_Settings
     b_Sort_Settings [R1], [Q1], [U1]
End Sub
Sub b_Sort_S()    'Сортировка по столбцу S
     '    Set A1 = [S1]: Set A2 = [Q1]: Set A3 = [M1]: A4 = "NO": A5 = "NO": A6 = "NO": A7 = "NO": A8 = "NO": A9 = "NO": b_Sort_Settings
     b_Sort_Settings [S1], [Q1], [M1]
End Sub
[/vba]

Автор - Саня
Дата добавления - 20.07.2015 в 11:58
SLAVICK Дата: Понедельник, 20.07.2015, 12:03 | Сообщение № 9
Группа: Модераторы
Ранг: Старожил
Сообщений: 2290
Репутация: 766 ±
Замечаний: 0% ±

2019
Так?:


Саня опередил hands
К сообщению приложен файл: 1155311.xlsm (26.8 Kb)


Иногда все проще чем кажется с первого взгляда.

Сообщение отредактировал SLAVICK - Понедельник, 20.07.2015, 12:04
 
Ответить
СообщениеТак?:


Саня опередил hands

Автор - SLAVICK
Дата добавления - 20.07.2015 в 12:03
rever27 Дата: Понедельник, 20.07.2015, 15:04 | Сообщение № 10
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 141
Репутация: 0 ±
Замечаний: 20% ±

Excel 2010
Спасибо, Товарищи! Узнал новый метод. Тяжко мне с массивами дружить )
 
Ответить
СообщениеСпасибо, Товарищи! Узнал новый метод. Тяжко мне с массивами дружить )

Автор - rever27
Дата добавления - 20.07.2015 в 15:04
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Цикл For для переменных (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!