Страницы: Пред. 1 2
RSS
Работа с массивами. Размерности массивов
 
Ошибка на Join. Читаем по F1 на Join:

Description
Returns a string created by joining a number of substrings contained in an array.
(возвращает строку, созданную путем объединения подстрок, содержащихся в скалярном массиве (array - одномерный массив)

Syntax

Join(sourcearray[, delimiter])

The Join function syntax has these named arguments:

Part Description
sourcearray Required. One-dimensional array containing substrings to be joined.
Array-источник. Обязательно. Одноразмерный массив, содержащий подстроки для слияния.

delimiter Optional. String character used to separate the substrings in the returned string. If omitted, the space character (" ") is used. If delimiter is a zero-length string (""), all items in the list are concatenated with no delimiters.

Для всех этих экзерсисов используются одномерные массивы с индексами элементов, начинающихся с 0.
Кому решение нужно - тот пример и рисует.
 
если ошибка есть есть - ее нужно исправлять в своем коде, а не искать причину в работе массивов
из этого всего:
Код
ReDim temp(1 To Selection.Cells.Count, 1 To 1)
temp() = Selection.Value: itxt = Join(temp(), ", ")
ReDim temp(1 To Selection.Cells.Count, 1 To 1)
temp() = Split(itxt, ", ")
оставьте:
temp() = Selection.Value
даже так оставьте:
temp = Selection.Value
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Sanja, хочу соединить весь Selection через такой же разделитель, как и у слов внутри ячейки - ", ". Потом разъединить полученную строку по этому разделителю опять в массив, извлечь из нового массива уникальные с помощью функции (она рабочая) и всё. Ну вставить на лист ещё можно, но это нюансы
TheBestOfTheBest, читал. И что диапазон с листа - двумерный массив тоже понял. Не могу исправить код (ReDim или что там нужно)
Пытливый, то есть нижнюю границу надо с 0 переназначить что-ли?
Ігор Гончаренко, я вот тоже так думал, но нет
КОД
Изменено: Jack Famous - 26.01.2018 16:25:16
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Вот что можно сделать для Вашего кода
Скрытый текст
Изменено: TheBestOfTheBest - 26.01.2018 16:34:58
Неизлечимых болезней нет, есть неизлечимые люди.
 
Нет, так не пойдет, поскольку для Join надо использовать одномерный массив (оно так в help написано), а у вас используется temp(1 to много, 1 to 1) - двумерный. :)
Там можно циклами из массива в строку собирать, без Join.
Кому решение нужно - тот пример и рисует.
 
TheBestOfTheBest, Function GetOneFrom2() превращает ЛЮБОЙ двухмерный массив в одномерный - я правильно понял?
Пытливый, циклы долгие - хотелось изящно))) казалось, что решение на поверхности
Изменено: Jack Famous - 26.01.2018 16:39:35
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
TheBestOfTheBest написал:
Вот что можно сделать для Вашего кода
А это мой вариант, но без доп. функции

Код
Sub Extract()
Dim temp(), cl As Range
Dim i&, arr$(), ikey, dic As Object
temp = Range([a1], [a1].End(xlDown)).Value
With CreateObject("Scripting.Dictionary")
    For i = 1 To UBound(temp)
        arr = Split(temp(i, 1), ",")
        For Each ikey In arr
            .Item(CStr(Trim(ikey))) = 0
        Next ikey
    Next i
    Set cl = Application.InputBox("Укажите ячейку вставки:", "Выбрать ОДНУ ячейку", , Type:=8)
    cl.Resize(.Count).Value2 = Application.Transpose(.keys)
End With
End Sub
Изменено: Nordheim - 26.01.2018 16:37:56
"Все гениальное просто, а все простое гениально!!!"
 
Цитата
Nordheim написал:
А это мой вариант, но без доп. функции
Будет работать только для Selection колонки, для строки надо допиливать?
Скрытый текст
Изменено: TheBestOfTheBest - 26.01.2018 16:56:41
Неизлечимых болезней нет, есть неизлечимые люди.
 
Nordheim, мощно! Расщепление на ходу и очень быстрое. Учусь на ваших кодах в том числе)))
скажите - а Join в данном случае - действительно плохая тема? Типа сцепить всё и потом всё разбить…
Загорелся подобным после вот этого примера
TheBestOfTheBest, то есть только для Selection, в котором не более 1 столбца?

Ребят, спасибо всем большое за очередной урок! Разберусь и отпишусь  ;)
Изменено: Jack Famous - 26.01.2018 16:42:08
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
все работает и так:
Код
Sub Extract()  
  Dim arr(), temp(), cl As Range
  temp = Selection.Value: arr() = GetUniqArrFromArr(temp)
  Set cl = Application.InputBox("Oea?eoa y?aeeo anoaaee:", "Aua?aou IAIO y?aeeo", , Type:=8)
  cl.Resize(UBound(arr) + 1).Value2 = WorksheetFunction.Transpose(arr)
End Sub

'================================================================================================================
Public Function GetUniqArrFromArr(WF_arr As Variant) As Variant
  Dim x, iTemp
  With CreateObject("Scripting.Dictionary")
    For Each x In WF_arr
      If Len(x) > 0 Then iTemp = .Item(x)
    Next x
  GetUniqArrFromArr = .Keys
  End With
End Function
а Function GetOneFrom2() собирает из отмеченного диапазона словарь (совершенно диким способом, но собирает!) просто Вы потом возвращаете ключи из этого словаря (собственно, ничего другого в словаре собранном таким кодом и не нет и взять больше нечего)
ВСЕ ПОВТОРЯЮЩИЕСЯ значения из отмеченного диапазона войдут в конечный массив ТОЛЬКО по 1 разу
не знаю, для чего это используете Вы, по по факту этот код из ЛЮБОГО исходного диапазона формирует вертикальный список содержащий неповторяющиеся значения
Изменено: Ігор Гончаренко - 26.01.2018 16:59:59
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Ігор Гончаренко написал:
все работает и так:
так - да не так))) полученный диапазон содержит уникальные ячейки, а не коды))))
вот тут ссылка на тему - нужно было получить именно уникальные коды
Цитата
Ігор Гончаренко написал:
Function GetOneFrom2()
это не моя функция)))
Изменено: Jack Famous - 26.01.2018 16:59:09
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
TheBestOfTheBest написал:
Будет работать только для Selection колонки, для строки надо допиливать?
Вариант для любого количества столбцов и строк :)
Код
Sub Extract()
Dim temp(), cl As Range
Dim arr$(), ikey, lkey, dic As Object
temp = Range([a1], [a1].End(xlDown)).Value
With CreateObject("Scripting.Dictionary")
    For Each lkey In temp
        arr = Split(lkey, ",")
        For Each ikey In arr
            .Item(CStr(Trim(ikey))) = 0
        Next ikey
    Next lkey
    Set cl = Application.InputBox("Укажите ячейку вставки:", "Выбрать ОДНУ ячейку", , Type:=8)
    cl.Resize(.Count).Value2 = Application.Transpose(.keys)
End With
End Sub
"Все гениальное просто, а все простое гениально!!!"
 
какая разница чья функция, я написал что она делает по факту
функция GetOneFrom2() из переданного ей массива условно удаляет повторы и возвращает массив из неповторяющихся значений
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Ігор Гончаренко написал:
функция GetOneFrom2() из переданного ей массива условно удаляет повторы
Не заметил, она задумана для преобразования двумерного массива в одномерный причем по "длинной стороне".
Наверное речь о GetUniqArrFromArr
Изменено: TheBestOfTheBest - 26.01.2018 17:08:08
Неизлечимых болезней нет, есть неизлечимые люди.
 
Ігор Гончаренко, TheBestOfTheBest, думаю, что Игорь имел ввиду всё-таки мою GetUniqArrFromArr()
Ну как "мою" - это от ZVI)))
Изменено: Jack Famous - 26.01.2018 17:09:39
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
сюрприз!)))
а еще, назвать ее можно GetOneFromAny
и если ей скормить 10-мерный массив - на выходе будет одномерный, содержащий исключительно разные значения
Изменено: Ігор Гончаренко - 26.01.2018 17:23:50
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Вообще-то, код #42 оптимален для решения задачи, но названию темы он совершенно не соответствует - где массивы и их размерности? )
Изменено: TheBestOfTheBest - 26.01.2018 17:15:27
Неизлечимых болезней нет, есть неизлечимые люди.
 
Тут нет размерностей, но есть перебор элементов массива, а это вроде как относится к "Работе с массивом".  :D
"Все гениальное просто, а все простое гениально!!!"
 
Больше относится к циклам, хотя "на вкус и цвет..."

Вот еще хороший пример по массивам
Изменено: TheBestOfTheBest - 26.01.2018 17:28:34
Неизлечимых болезней нет, есть неизлечимые люди.
 
Nordheim, мне понравилось, всё равно)))) очень полезный код))
TheBestOfTheBest, чисто формально вы правы))  :idea: спасибо за ссылку - многое с этого сайта подсматриваю  ;)
Изменено: Jack Famous - 29.01.2018 10:12:32
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Страницы: Пред. 1 2
Наверх