Форум программистов, компьютерный форум, киберфорум
Наши страницы
VBA
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
SSL-13
2 / 2 / 0
Регистрация: 10.07.2017
Сообщений: 29
1

Статические строковые массивы - VBA Excel 2016

10.07.2017, 20:21. Просмотров 2898. Ответов 12
Метки нет (Все метки)

Здравствуйте.
Помогите разобраться! 6 часов угробил на тесты и поиски ответов - ничего не пойму.
С числовыми массивами проблем вроде нет, а вот со строковыми...

Есть несколько готовых списков данных, с заранее известным кол-вом.
Как правильно запихнуть их в массивы для дальнейшей обработки?

Один из простейших тестовых примеров:
Visual Basic
1
2
3
4
Sub iniarr()
    Dim s(3) As String
    s = [("a", "b", "c", "d")]
End Sub
выдает ошибку компиляции: "Can't assign to array".

В других вариантах получаю либо несоответствие типов, (ошибка 13), либо еще что...
А нужен еще и 2D-массив (4 ряда по 7 строк), что-то вроде
Values = [("0","100"; "0","-10000"; "0","1.00"; и т.д.)]

Не по штучно же инициализировать каждое значение, типа
s(0) = "a"
s(1) = "b"
...?
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.07.2017, 20:21
Ответы с готовыми решениями:

Двухмерные массивы в Excel VBA
1. Заполнить двумерный массив (таблицу) случайными целыми числами. Размерность массива (8,3)....

Vba excel windows и vba excel Mac Os - Макинтош корявит шрифт
Всем привет, столкнулся с такой ситуацией. Макросы написаны на Excel 2016 Windows. Когда файл...

Макрос для загрузки картинок - работал в Excel 2013, но не работает в Excel 2016
Добрый день! Имеется макрос который работал в Excel 2013, но не работает в Excel 2016. ...

Строковые функции. VBA
Здравствуйте. Прошу помощи с решением задачи на VBA. Даны шифры трех ГАИ . Определить есть ли среди...

Работа в VBA Строковые данные. Нужен Код
Запуталась в лабе , жду вашей помощи :( Нужен код для программы, которая : 1. Вставляет после...

12
SoftIce
es geht mir gut
11192 / 4615 / 1163
Регистрация: 27.07.2011
Сообщений: 11,318
Завершенные тесты: 1
10.07.2017, 20:25 2
Visual Basic
1
2
3
4
Sub iniarr()
    Dim  s
    s =array("a", "b", "c", "d") 
End Sub
1
pashulka
3333 / 1784 / 751
Регистрация: 01.12.2010
Сообщений: 3,555
10.07.2017, 20:32 3
В Excel можно ещё и так :

Visual Basic
1
2
3
4
Private Sub Test()
    Dim s As Variant
    s = [{"a","b","c","d"}]
End Sub
2
SSL-13
2 / 2 / 0
Регистрация: 10.07.2017
Сообщений: 29
10.07.2017, 20:49  [ТС] 4
SoftIce, pashulka, спасибо за оперативность!

Если я правильно понимаю, то оба варианта идентичны и, на данном этапе, они действительно работают.
Но в дальнейшем нужно передать значения этих массивов в качестве строковых аргументов, а в данном виде массивы получаются как бы не строковые... Во всяком случае, принимающая их функция
Visual Basic
1
2
3
4
5
6
Function x(inAction As iniAction, _
                             sSection As String, _
                             sKey As String, _
                             sIniFile As String, _
                             Optional sValue As String) As String
    ...
ругается:
ByRef argument type mismatch
0
10.07.2017, 20:49
pashulka
3333 / 1784 / 751
Регистрация: 01.12.2010
Сообщений: 3,555
10.07.2017, 21:05 5
Варианты решения принципиально разные, а результаты - идентичны.

Что касается нового вопроса, то три варианта (на выбор)

1) ByVal
2) CStr(s(индекс))
3) (s(индекс))
1
SoftIce
es geht mir gut
11192 / 4615 / 1163
Регистрация: 27.07.2011
Сообщений: 11,318
Завершенные тесты: 1
10.07.2017, 21:06 6
А 2016 такие вольности допускает?
1
Миниатюры
Статические строковые массивы - VBA Excel 2016  
Алиса Сискина
Заблокирован
10.07.2017, 21:16 7
Возможно, я повторяю слова уважаемого SoftIce, но тип Variant допускает вольности при передаче данных (с обеих сторон), ищите - да обрящете.
0
SSL-13
2 / 2 / 0
Регистрация: 10.07.2017
Сообщений: 29
10.07.2017, 21:47  [ТС] 8
Цитата Сообщение от SoftIce Посмотреть сообщение
А 2016 такие вольности допускает?
Результат тот же: ByRef argument type mismatch.
До функции с дебагом дело не дошло.

Цитата Сообщение от pashulka Посмотреть сообщение
1) ByVal
2) CStr(s(индекс))
3) (s(индекс))
Ладно, попробую с преобразователями поиграться.

Алиса Сискина, просто странно, что именно со строковыми данными так криво выходит. И в инете ничего толкового на эту тему...
Давно не игрался с VBA, а тут пришлось вернуться, - быстро разобрался, много кода написал и вот застрял на пол-дня из-за такой ерунды.
0
pashulka
3333 / 1784 / 751
Регистрация: 01.12.2010
Сообщений: 3,555
10.07.2017, 22:02 9
Цитата Сообщение от SSL-13 Посмотреть сообщение
Ладно, попробую с преобразователями поиграться.
Преобразование только во втором варианте, а вообще, если не тратить время на реальную ерунду, то :

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Function x1(ByVal sSection As String) As String
    
End Function
 
Function x2(sSection As String) As String
    
End Function
 
 
Private Sub Test()
    Dim s As Variant
    s = [{"a","b","c","d"}]
    
    Call x1(s(1))
    Call x2(CStr(s(2)))
    Call x2((s(3)))
End Sub
1
SSL-13
2 / 2 / 0
Регистрация: 10.07.2017
Сообщений: 29
10.07.2017, 23:21  [ТС] 10
Цитата Сообщение от pashulka Посмотреть сообщение
если не тратить время на реальную ерунду, то :
1-й вариант еще не пробовал, но зато перепробовал различные комбинации с остальными - моя крыша начинает от меня отползать.

Visual Basic
1
2
3
4
5
6
7
Sub test()
    Dim s As Variant
    s = [("a", "b", "c", "d")]
 
    Dim Z As String
    *
End Sub
Вместо * вставляем любую из след. строк

Z = s(0)
Z = (s(0))
Z = CStr(s(0))
MsgBox (s(1))
MsgBox CStr(s(2))
MsgBox "" & CStr(s(3))

На любой из них получаем:
Run-time error '13';
Type mismatch


Это как?
0
Алиса Сискина
Заблокирован
10.07.2017, 23:43 11
SSL-13, чтобы не тратить время - напишите вместо этого
s = [("a", "b", "c", "d")]
вот это (бэйсик - это не паскаль)
s = array("a", "b", "c", "d")
0
SoftIce
es geht mir gut
11192 / 4615 / 1163
Регистрация: 27.07.2011
Сообщений: 11,318
Завершенные тесты: 1
11.07.2017, 06:34 12
Лучший ответ Сообщение было отмечено SSL-13 как решение

Решение

Цитата Сообщение от SSL-13 Посмотреть сообщение
Это как?
Это Ваша невнимательность.

Сравните :
Цитата Сообщение от SSL-13 Посмотреть сообщение
Visual Basic
1
s = [("a", "b", "c", "d")]
и
Цитата Сообщение от pashulka Посмотреть сообщение
Visual Basic
1
s = [{"a","b","c","d"}]
Видите разницу?

А у Вас получается вот что:
1
Миниатюры
Статические строковые массивы - VBA Excel 2016  
SSL-13
2 / 2 / 0
Регистрация: 10.07.2017
Сообщений: 29
11.07.2017, 11:06  [ТС] 13
Вот же беда какая... пока очки не одел, (в прямом смысле слова!) разницы не видел.
ВСЕМ огромное спасибо!!!
0
11.07.2017, 11:06
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.07.2017, 11:06

VBA Access 2016. Работа с Recordset
Доброго времени суток, в общем передо мной стоит задача: есть таблица с данными (lab3) из неё надо...

Статические массивы,Динамические массивы,строки
1)Создать двумерный массив A(N,M) целых положительных и отрицательных чисел с помощью функции...

Разные результаты сортировки в Excel 2007 и Excel 2016
Всем привет. Есть таблица данных. Нужно отсротировать ее сначала по типу населенного пункта, а...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.