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

Вход

Регистрация

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

 

= Мир MS Excel/Option Base. Вопрос по выводу массива на лист. - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Option Base. Вопрос по выводу массива на лист. (Макросы Sub)
Option Base. Вопрос по выводу массива на лист.
SkyPro Дата: Пятница, 25.10.2013, 12:06 | Сообщение № 1
Группа: Друзья
Ранг: Старожил
Сообщений: 1206
Репутация: 255 ±
Замечаний: 0% ±

2010
Добрый день, уважаемые.
Вчера от безделья написал процедуру вывода уникальных значений из несвязанных диапазонов.
Вроде все работает, но есть нюанс, который я не понимаю.
Подскажите, почему с Option Base 0 данный код выводит значения начиная с второй ячейки, а с Option Base 1 с первой?

[vba]
Код
'Option Base 1

Private Sub UniqVal(ByVal uniq As Range, ParamArray rNotUniq())

'uniq - ячейка с которой начнется вывод уникальных значений
'rNotUniq - Диапазоны с которых берутся значения

Dim x, y, t$
Dim UniqArray
Dim UniqCollection As New Collection
On Error Resume Next

With UniqCollection
      For Each x In rNotUniq
      UniqArray = x.Value
          For Each y In UniqArray
          t = Trim(y)
              If Len(t) > 0 Then
                  .Add t, t
              End If
          Next
      Next
        
ReDim UniqArray(.Count)
          For x = 0 To .Count
              UniqArray(x) = .Item(x)
          Next
End With

uniq.Resize(UBound(UniqArray) + 1).Value = WorksheetFunction.Transpose(UniqArray)
End Sub
[/vba]

А еще почему коллекция отказывается принимать числа, если их не перевести в текст?
К сообщению приложен файл: UniqueValues_op.xls (45.0 Kb)


skypro1111@gmail.com

Сообщение отредактировал SkyPro - Пятница, 25.10.2013, 12:07
 
Ответить
СообщениеДобрый день, уважаемые.
Вчера от безделья написал процедуру вывода уникальных значений из несвязанных диапазонов.
Вроде все работает, но есть нюанс, который я не понимаю.
Подскажите, почему с Option Base 0 данный код выводит значения начиная с второй ячейки, а с Option Base 1 с первой?

[vba]
Код
'Option Base 1

Private Sub UniqVal(ByVal uniq As Range, ParamArray rNotUniq())

'uniq - ячейка с которой начнется вывод уникальных значений
'rNotUniq - Диапазоны с которых берутся значения

Dim x, y, t$
Dim UniqArray
Dim UniqCollection As New Collection
On Error Resume Next

With UniqCollection
      For Each x In rNotUniq
      UniqArray = x.Value
          For Each y In UniqArray
          t = Trim(y)
              If Len(t) > 0 Then
                  .Add t, t
              End If
          Next
      Next
        
ReDim UniqArray(.Count)
          For x = 0 To .Count
              UniqArray(x) = .Item(x)
          Next
End With

uniq.Resize(UBound(UniqArray) + 1).Value = WorksheetFunction.Transpose(UniqArray)
End Sub
[/vba]

А еще почему коллекция отказывается принимать числа, если их не перевести в текст?

Автор - SkyPro
Дата добавления - 25.10.2013 в 12:06
nilem Дата: Пятница, 25.10.2013, 13:09 | Сообщение № 2
Группа: Авторы
Ранг: Старожил
Сообщений: 1613
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
Наверное, вот эту строку нужно смотреть:
[vba]
Код
ReDim UniqArray(.Count)
[/vba] .Count у нас = 16
если Option Base 0,
то UniqArray будет иметь элементы с индексами 0, 1, 2, ... 16 - всего 17 элементов (при этом UBound(UniqArray)=16)
в цикле
UniqArray(0) = .Item(0) - тут возникает ошибка, т.к. у коллекции нет .Item(0) и элемент UniqArray(0) остается Empty. Вот этот Empty и записывается в яч. F1, а uniq.Resize(UBound(UniqArray) + 1).Value заполняет яч. F1:F17.

А если Option Base 1,
то UniqArray будет иметь элементы с индексами 1, 2, ... 16 - всего 16 элементов (при этом UBound(UniqArray)=16)
в цикле
UniqArray(0) = .Item(0) - тут возникает ошибка, т.к. у коллекции нет .Item(0) и у UniqArray нет элемента с индексом 0. И uniq.Resize(UBound(UniqArray) + 1).Value заполняет яч. F1:F17, при этом в F17 получаем #Н/Д, потому что у массива всего 16 эл-тов.

Ну, как бы имхо :)


Яндекс.Деньги 4100159601573

Сообщение отредактировал nilem - Пятница, 25.10.2013, 13:10
 
Ответить
СообщениеНаверное, вот эту строку нужно смотреть:
[vba]
Код
ReDim UniqArray(.Count)
[/vba] .Count у нас = 16
если Option Base 0,
то UniqArray будет иметь элементы с индексами 0, 1, 2, ... 16 - всего 17 элементов (при этом UBound(UniqArray)=16)
в цикле
UniqArray(0) = .Item(0) - тут возникает ошибка, т.к. у коллекции нет .Item(0) и элемент UniqArray(0) остается Empty. Вот этот Empty и записывается в яч. F1, а uniq.Resize(UBound(UniqArray) + 1).Value заполняет яч. F1:F17.

А если Option Base 1,
то UniqArray будет иметь элементы с индексами 1, 2, ... 16 - всего 16 элементов (при этом UBound(UniqArray)=16)
в цикле
UniqArray(0) = .Item(0) - тут возникает ошибка, т.к. у коллекции нет .Item(0) и у UniqArray нет элемента с индексом 0. И uniq.Resize(UBound(UniqArray) + 1).Value заполняет яч. F1:F17, при этом в F17 получаем #Н/Д, потому что у массива всего 16 эл-тов.

Ну, как бы имхо :)

Автор - nilem
Дата добавления - 25.10.2013 в 13:09
SkyPro Дата: Пятница, 25.10.2013, 13:36 | Сообщение № 3
Группа: Друзья
Ранг: Старожил
Сообщений: 1206
Репутация: 255 ±
Замечаний: 0% ±

2010
Спасибо, Николай!
Допустим, что я понял :)
А как это побороть без применения оптион бейс 1?


skypro1111@gmail.com
 
Ответить
СообщениеСпасибо, Николай!
Допустим, что я понял :)
А как это побороть без применения оптион бейс 1?

Автор - SkyPro
Дата добавления - 25.10.2013 в 13:36
Poltava Дата: Пятница, 25.10.2013, 13:44 | Сообщение № 4
Группа: Друзья
Ранг: Форумчанин
Сообщений: 232
Репутация: 50 ±
Замечаний: 0% ±

Может так, если я правильно вопрос понял
[vba]
Код
ReDim UniqArray(1 To .Count)
           For x = 1 To .Count
               UniqArray(x) = .Item(x)
           Next
End With
uniq.Resize(UBound(UniqArray)).Value = WorksheetFunction.Transpose(UniqArray)
[/vba]


Сообщение отредактировал Poltava - Пятница, 25.10.2013, 13:45
 
Ответить
СообщениеМожет так, если я правильно вопрос понял
[vba]
Код
ReDim UniqArray(1 To .Count)
           For x = 1 To .Count
               UniqArray(x) = .Item(x)
           Next
End With
uniq.Resize(UBound(UniqArray)).Value = WorksheetFunction.Transpose(UniqArray)
[/vba]

Автор - Poltava
Дата добавления - 25.10.2013 в 13:44
nilem Дата: Пятница, 25.10.2013, 13:47 | Сообщение № 5
Группа: Авторы
Ранг: Старожил
Сообщений: 1613
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
[vba]
Код
ReDim UniqArray(1 To .Count)
[/vba] для любого Option Base
и
[vba]
Код
uniq.Resize(UBound(UniqArray)).Value = ...
[/vba]
а еще удобно открыть окно Locals и в пошаговом режиме (по F8) посмотреть, какие элементы есть у массива и коллекции и как они заполняются.


Яндекс.Деньги 4100159601573
 
Ответить
Сообщение[vba]
Код
ReDim UniqArray(1 To .Count)
[/vba] для любого Option Base
и
[vba]
Код
uniq.Resize(UBound(UniqArray)).Value = ...
[/vba]
а еще удобно открыть окно Locals и в пошаговом режиме (по F8) посмотреть, какие элементы есть у массива и коллекции и как они заполняются.

Автор - nilem
Дата добавления - 25.10.2013 в 13:47
SkyPro Дата: Пятница, 25.10.2013, 13:49 | Сообщение № 6
Группа: Друзья
Ранг: Старожил
Сообщений: 1206
Репутация: 255 ±
Замечаний: 0% ±

2010
Poltava, А я думал, что Redim нельзя изменить нижнюю границу.
Спасибо!

ЗЫ: А как быть с записью в коллекцию? Почему не принимает числа?


skypro1111@gmail.com
 
Ответить
СообщениеPoltava, А я думал, что Redim нельзя изменить нижнюю границу.
Спасибо!

ЗЫ: А как быть с записью в коллекцию? Почему не принимает числа?

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

2003; 2007; 2010; 2013 RUS
А как это побороть без применения оптион бейс 1?


Вроде так должно работать
[vba]
Код
UniqArray(x - 1) = .Item(x)
[/vba]


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


Вроде так должно работать
[vba]
Код
UniqArray(x - 1) = .Item(x)
[/vba]

Автор - _Boroda_
Дата добавления - 25.10.2013 в 13:50
SkyPro Дата: Пятница, 25.10.2013, 13:52 | Сообщение № 8
Группа: Друзья
Ранг: Старожил
Сообщений: 1206
Репутация: 255 ±
Замечаний: 0% ±

2010
Все гениальное - просто!

ЗЫ: Пора научиться пользоваться локал виндов.


skypro1111@gmail.com
 
Ответить
СообщениеВсе гениальное - просто!

ЗЫ: Пора научиться пользоваться локал виндов.

Автор - SkyPro
Дата добавления - 25.10.2013 в 13:52
SkyPro Дата: Суббота, 26.10.2013, 17:17 | Сообщение № 9
Группа: Друзья
Ранг: Старожил
Сообщений: 1206
Репутация: 255 ±
Замечаний: 0% ±

2010
ЗЫ:
Дошло тут наконец, что ReDim нижней границы возможен только в большую сторону, а в меньшую нельзя :)


skypro1111@gmail.com
 
Ответить
СообщениеЗЫ:
Дошло тут наконец, что ReDim нижней границы возможен только в большую сторону, а в меньшую нельзя :)

Автор - SkyPro
Дата добавления - 26.10.2013 в 17:17
nilem Дата: Суббота, 26.10.2013, 18:04 | Сообщение № 10
Группа: Авторы
Ранг: Старожил
Сообщений: 1613
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
Почему?
[vba]
Код
Sub ttt()
Dim x()
x = Array(1, 5, 4, 8, 9, 7)
MsgBox UBound(x) & " " & x(UBound(x))
ReDim Preserve x(3)
MsgBox UBound(x) & " " & x(UBound(x))
End Sub
[/vba]


Яндекс.Деньги 4100159601573
 
Ответить
СообщениеПочему?
[vba]
Код
Sub ttt()
Dim x()
x = Array(1, 5, 4, 8, 9, 7)
MsgBox UBound(x) & " " & x(UBound(x))
ReDim Preserve x(3)
MsgBox UBound(x) & " " & x(UBound(x))
End Sub
[/vba]

Автор - nilem
Дата добавления - 26.10.2013 в 18:04
nerv Дата: Воскресенье, 27.10.2013, 16:19 | Сообщение № 11
Группа: Редакторы
Ранг: Обитатель
Сообщений: 431
Репутация: 193 ±
Замечаний: 0% ±

Вчера от безделья написал процедуру вывода уникальных значений из несвязанных диапазонов.

собственно, все уже давно написано http://www.excelworld.ru/forum/3-2045-1
[vba]
Код
Sub io()
     Dim Col As New Collection_
      
     ' 1.
     ' Col.AddUnique [f1].Value
     ' Col.AddUnique [a1:a21].Value
     ' Col.AddUnique [c1:c21].Value
     ' Col.AddUnique [d1:d21].Value
      
     ' 2.
     Col.AddUnique Array([f1].Value, [a1:a21].Value, [c1:c21].Value, [d1:d21].Value)
      
     Range("J1").Resize(Col.Count).Value = Col.ToArray
End Sub
[/vba]

Твоя реализация много чего не учитывает, я не буду расписывать подробно (лениво).


Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


YM 41001156540584 / WM WMR R21924176233

https://github.com/nervgh/vba
 
Ответить
Сообщение
Вчера от безделья написал процедуру вывода уникальных значений из несвязанных диапазонов.

собственно, все уже давно написано http://www.excelworld.ru/forum/3-2045-1
[vba]
Код
Sub io()
     Dim Col As New Collection_
      
     ' 1.
     ' Col.AddUnique [f1].Value
     ' Col.AddUnique [a1:a21].Value
     ' Col.AddUnique [c1:c21].Value
     ' Col.AddUnique [d1:d21].Value
      
     ' 2.
     Col.AddUnique Array([f1].Value, [a1:a21].Value, [c1:c21].Value, [d1:d21].Value)
      
     Range("J1").Resize(Col.Count).Value = Col.ToArray
End Sub
[/vba]

Твоя реализация много чего не учитывает, я не буду расписывать подробно (лениво).

Автор - nerv
Дата добавления - 27.10.2013 в 16:19
SkyPro Дата: Воскресенье, 27.10.2013, 18:22 | Сообщение № 12
Группа: Друзья
Ранг: Старожил
Сообщений: 1206
Репутация: 255 ±
Замечаний: 0% ±

2010
собственно, все уже давно написано

Угу. Написано уже много чего, но иногда хочется "изобрести велосипед". Тут ключевые слова "от безделья" :)
Но спасибо за ссылку :)


skypro1111@gmail.com
 
Ответить
Сообщение
собственно, все уже давно написано

Угу. Написано уже много чего, но иногда хочется "изобрести велосипед". Тут ключевые слова "от безделья" :)
Но спасибо за ссылку :)

Автор - SkyPro
Дата добавления - 27.10.2013 в 18:22
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Option Base. Вопрос по выводу массива на лист. (Макросы Sub)
  • Страница 1 из 1
  • 1
Поиск:

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