Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / hi all, преобразовать элементы массива / 17 сообщений из 17, страница 1 из 1
24.08.2007, 15:36:28
    #34751296
evgenius_b
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hi all, преобразовать элементы массива
Подскажите, как проще преобразовать элементы массива?

Есть MyArray(1 To Cnt).
Элементы MyArray - строковые величины, как-то:
MyArray(1) = ", session duration: 2484 ms."
MyArray(2) = ", session duration: 5484 ms."
MyArray(3) = ", session duration: 1000 ms."

Нуна: создать новый массив, элементы которого - integer. Например
MyArray(1) = 2484
MyArray(2) = 5484
MyArray(3) = 1000

Есть варианты?

Можно, конечно, записать макрос "Текст по столбцам" и поглядеть как это делает VBA, но не хотелося в рабочей книге плодить промежуточные таблицы с массивами.
...
Рейтинг: 0 / 0
24.08.2007, 16:32:24
    #34751497
KL (XL)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hi all, преобразовать элементы массива
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Sub test1()
    Dim MyArray( 1  To  3 ) As String, MyArrayNew( 1  To  3 ) As Long
    MyArray( 1 ) = ", session duration: 2484 ms."
    MyArray( 2 ) = ", session duration: 5484 ms."
    MyArray( 3 ) = ", session duration: 1000 ms."
    For i =  1  To  3 
        MyArrayNew(i) = Application.Index(Split(MyArray(i), " "),  4 )
    Next i
End Sub

Sub test2()
    Dim MyArray( 1  To  3 ) As String, MyArrayNew( 1  To  3 ) As Long
    MyArray( 1 ) = ", session duration: 2484 ms."
    MyArray( 2 ) = ", session duration: 5484 ms."
    MyArray( 3 ) = ", session duration: 1000 ms."
    For i =  1  To  3 
        MyArrayNew(i) = Val(Mid(MyArray(i), InStr(MyArray(i), ":") +  2 ,  255 ))
    Next i
End Sub
KL
[MVP - Microsoft Excel]
...
Рейтинг: 0 / 0
24.08.2007, 16:46:45
    #34751542
evgenius_b
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hi all, преобразовать элементы массива
Хех! :)

программисты жгут :)

Я ж имел ввиду - есть ли хоть один вариант решения.
А тут целых два.
Подозреваю, что не единственные. Но!

Спасибо человеческое.
...
Рейтинг: 0 / 0
24.08.2007, 17:28:45
    #34751692
Deggasad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hi all, преобразовать элементы массива
evgenius_bХех! :)

Подозреваю, что не единственные. Но!



Не единственные, но они мало чем отличаются, например

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Sub test3()
    Dim MyArray( 1  To  3 ) As String, MyArrayNew( 1  To  3 ) As Long
    MyArray( 1 ) = ", session duration: 2484 ms."
    MyArray( 2 ) = ", session duration: 5484 ms."
    MyArray( 3 ) = ", session duration: 1000 ms."
    
    For i =  1  To  3 
      MyArrayNew(i) = Val(Replace(MyArray(i), ", session duration: ", ""))
    Next i
    
End Sub
...
Рейтинг: 0 / 0
24.08.2007, 18:50:56
    #34751917
KL (XL)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hi all, преобразовать элементы массива
В зависимости от того, где будет применяться результирующий массив, есть еще вариант получения значений ввиде строковых величин, но зато очень быстро:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Sub test3()
    Dim MyArray( 1  To  3 ) As String, MyArrayNew()
    MyArray( 1 ) = ", session duration: 2484 ms."
    MyArray( 2 ) = ", session duration: 5484 ms."
    MyArray( 3 ) = ", session duration: 1000 ms."
    With Application
        MyArrayNew = .Substitute(.Substitute(MyArray, ", session duration: ", ""), " ms.", "")
        [A1:C1] = MyArrayNew
        [A3:A5] = .Transpose(MyArrayNew)
    End With
End Sub


KL
[MVP - Microsoft Excel]
...
Рейтинг: 0 / 0
24.08.2007, 20:24:32
    #34752064
Deggasad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hi all, преобразовать элементы массива
Я так пробывал у меня почему то не получилось. Вообще не смог разобраться как можно массивы в формулы запихнуть чтобы не в цикле?
И ещё почему нельзя массивы прировнять
Код: plaintext
MyArrayNew = MyArray
или можно, а я не знаю как???
...
Рейтинг: 0 / 0
24.08.2007, 23:15:16
    #34752186
KL (XL)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hi all, преобразовать элементы массива
DeggasadЯ так пробывал у меня почему то не получилось. Вообще не смог разобраться как можно массивы в формулы запихнуть чтобы не в цикле?
Ну здесь, вобщем, ответ в моем примере: это должны быть функции листа поддерживающие массивы и доступные через коллекцию WorksheetFunction, функции VBA и математические операторы не подходят. И массив, которому присваиваешь,должен быть динамическим.
DeggasadИ ещё почему нельзя массивы прировнять
Код: plaintext
MyArrayNew = MyArray
или можно, а я не знаю как???
Почему нельзя? Можно. Только опять-таки массив, которому присваиваешь, должен быть динамическим:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Sub test4()
    Dim MyArray( 1  To  3 ) As String, MyArrayNew
    MyArray( 1 ) = ", session duration: 2484 ms."
    MyArray( 2 ) = ", session duration: 5484 ms."
    MyArray( 3 ) = ", session duration: 1000 ms."
    MyArrayNew = MyArray
End Sub

Sub test5()
    Dim MyArray, MyArrayNew
    MyArray = Array(", session duration: 2484 ms.", ", session duration: 5484 ms.", ", session duration: 1000 ms.")
    With Application
        MyArrayNew = .Substitute(.Substitute(MyArray, ", session duration: ", ""), " ms.", "")
        MyArray = MyArrayNew
    End With
End Sub
...
Рейтинг: 0 / 0
25.08.2007, 08:53:51
    #34752290
Deggasad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hi all, преобразовать элементы массива
Запутался и в справке что-то не найду. Мелочь вроде...
Если объвляю переменную
Код: plaintext
Dim MyArrayNew
, то можно и прировнять массивы и через функцию рабочего листа, а если объявляю переменную
Код: plaintext
Dim MyArrayNew()
, то только функцией рабочего листа ожно, а прировнять нельзя.
Есть предположение, что через функцию рабочего листа сразу массив возвращается, а если приравнивать, то по одному значению обрабатывает и поэтому первый раз не проходит ведь после первого значения это ещё не массив. Но не знаю правильно ли я думаю?
И ещё что такое динамический массив? я почти что знаю, но всё таки...
...
Рейтинг: 0 / 0
25.08.2007, 14:32:11
    #34752412
KL (XL)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hi all, преобразовать элементы массива
DeggasadЗапутался и в справке что-то не найду. Мелочь вроде...
Если объвляю переменную
Код: plaintext
Dim MyArrayNew
, то можно и прировнять массивы и через функцию рабочего листа, а если объявляю переменную
Код: plaintext
Dim MyArrayNew()
, то только функцией рабочего листа ожно, а прировнять нельзя.
Есть предположение, что через функцию рабочего листа сразу массив возвращается, а если приравнивать, то по одному значению обрабатывает и поэтому первый раз не проходит ведь после первого значения это ещё не массив. Но не знаю правильно ли я думаю?
И ещё что такое динамический массив? я почти что знаю, но всё таки...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Sub test6()
    Dim MyArray(), MyArrayNew()
    MyArray = Array(", session duration: 2484 ms.", ", session duration: 5484 ms.", ", session duration: 1000 ms.")
    With Application
        MyArrayNew = .Substitute(.Substitute(MyArray, ", session duration: ", ""), " ms.", "")
        MyArray = MyArrayNew
    End With
End Sub

Динамический массив - это тот, размеры которого заранее не определены и его тип Variant. Например:

Объявление переменной МассивDim arrMyArray(1)Не динамический Dim arrMyArray(1 To 20) As LongНе динамический Dim arrMyArray()Динамический Dim arrMyArrayДинамический

KL
[MVP - Microsoft Excel]
...
Рейтинг: 0 / 0
27.08.2007, 00:24:03
    #34753339
Бабай
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hi all, преобразовать элементы массива
авторДинамический массив - это тот, размеры которого заранее не определены и его тип Variant.
это неверное определение.
Динамический массив - это тот, который был создан оператором ReDim или
определение которого в утверждении Dim не содержало указаний на размерность массива:

ReDim MyArray1(-1 to 121) as Currency
Dim MyArray2() As String

И то и другое предопределяет динамический тип массива.

----
Спасибо за указание возможности использовать WorksheetFunctions напрямую от application
я об этом не знал. Есть ли в таком использовании какая-то плата за производительность?

Если можно, еще вопрос про Excel
На форуме часто проскакивает использование оператора -- в формулах Excel
Где можно прочитать о работе и правилах применения оператора -- ?
...
Рейтинг: 0 / 0
27.08.2007, 02:57:53
    #34753352
KL (XL)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hi all, преобразовать элементы массива
бабайэто неверное определение.
Динамический массив - это тот, который был создан оператором ReDim или
определение которого в утверждении Dim не содержало указаний на размерность массива:

ReDim MyArray1(-1 to 121) as Currency
Dim MyArray2() As String

И то и другое предопределяет динамический тип массива.
Пожалуй насчет Variant я погорячился :-)

бабайСпасибо за указание возможности использовать WorksheetFunctions напрямую от application я об этом не знал. Есть ли в таком использовании какая-то плата за производительность? Нет, только надо иметь ввиду это:

Данные из диапазона - в цикл для ADO

бабайНа форуме часто проскакивает использование оператора -- в формулах Excel
Где можно прочитать о работе и правилах применения оператора -- ?
Это просто повтор оператора - (минус). Он служит для форсированного превращения нечисловых величин в их числовой эквивалент, если таковой имеется. Например:

--ИСТИНА=1
--ЛОЖЬ=0
--{ИСТИНА;ЛОЖЬ;ИСТИНА}={1;0;1}
--"234"=234
--"2007-08-26"=26/8/2007
и т.д.

см. также:
http://www.mcgimpsey.com/excel/formulae/doubleneg.html
http://www.xldynamic.com/source/xld.SUMPRODUCT.html
...
Рейтинг: 0 / 0
27.08.2007, 21:45:36
    #34756389
Бабай
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hi all, преобразовать элементы массива
2 KL (XL) спасибо за разъяснения.
...
Рейтинг: 0 / 0
28.08.2007, 14:20:51
    #34758220
evgenius_b
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hi all, преобразовать элементы массива
че то я снова потерялся в мире VBA.
Код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
    Dim MyArray( 1  To  3 ) As String, MyArrayNew( 1  To  3 ) As Long
    MyArray( 1 ) = ", session duration: 2484 ms."
    MyArray( 2 ) = ", session duration: 5484 ms."
    MyArray( 3 ) = ", session duration: 1000 ms."
    For i =  1  To  3 
        MyArrayNew(i) = Application.Index(Split(MyArray(i), " "),  4 )
    Next i

'    Sheets("Temp").Select
    ActiveSheet.Range("G2").Select
    For m =  1  To  3 
    ActiveCell.Value = MyArrayNew(m)
    ActiveCell.Offset( 1 ,  0 ).Select
    Next m

В одном проекте работает, а в другом выдает ошибку:
Wrong number of arguments or invalid property assignment (Error 450)

Одновременно открыты 2 проекта, попеременно запускаю код. В самом нужном проекте результат - Error 450.
Что можно сделать?
Что такое "Set the Index property to a nonzero value in the control's property sheet or property window at design time." (взято из справки по ошибке).
...
Рейтинг: 0 / 0
28.08.2007, 14:22:03
    #34758229
evgenius_b
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hi all, преобразовать элементы массива
ругается вот на эту строку
MyArrayNew(n) = Application.Index(Split(MyArray(n), " "), 4
...
Рейтинг: 0 / 0
28.08.2007, 14:23:19
    #34758234
evgenius_b
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hi all, преобразовать элементы массива
сорри - на такую:
MyArrayNew(i) = Application.Index(Split(MyArray(i), " "), 4)
...
Рейтинг: 0 / 0
28.08.2007, 14:36:22
    #34758279
evgenius_b
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hi all, преобразовать элементы массива
а если убрать из поекта вот этот макрос, то все работает

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
Sub Split()
Dim Row As Integer
Row =  0                                                '


S_Sent_Cnt =  0 
S_Received_Cnt =  0 
    Range("A1").Select
    Range(Selection, Selection.End(xlDown)).Select
    MesQnt = Selection.Rows.Count
    
For Row =  0  To MesQnt
Set TheCell_4 = Range("F1").Offset(Row,  1 )
Debug.Print Row
Debug.Print TheCell_4.Value
If (TheCell_4.Value Like "*duration:*") Then
m = m +  1 
Debug.Print m
End If
Next Row

End Sub

Бред какой-то. Этот модуль рабочий и нужен.
...
Рейтинг: 0 / 0
28.08.2007, 14:46:17
    #34758326
evgenius_b
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hi all, преобразовать элементы массива
эх, жаль, невозможно сообщения удалять.
В цейтноте горячки напорол, Семен Семеныч.
Нефиг подпограммы обзывать зарезервированными именами.
...
Рейтинг: 0 / 0
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / hi all, преобразовать элементы массива / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]