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

Вход

Регистрация

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

 

= Мир MS Excel/Динамическое заполнение двумерного массива - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Динамическое заполнение двумерного массива (Макросы/Sub)
Динамическое заполнение двумерного массива
tsch Дата: Среда, 01.02.2017, 17:45 | Сообщение № 1
Группа: Пользователи
Ранг: Новичок
Сообщений: 15
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Добрый день!
Подскажите, пожалуйста, как реализовать заполнение динамического массива. Приведенный ниже код не работает, ругается на ошибку синтаксиса в выражении massive(, k) = Cells(i, 3).Value(), а как сделать так, чтобы не ругался, тяму не хватает. С одномерным массивом все работает корректно.

[vba]
Код
Sub massiveTest()
    Dim i, k As Integer
    ReDim massive(0, 0) As String
    i = 2
    k = 0
    
    Do While Cells(i, 1) <> 0
        k = k + 1
        ReDim Preserve massive(k, k) As String
        massive(k) = Cells(i, 2).Value()
        massive(, k) = Cells(i, 3).Value()
        i = i + 1
        MsgBox massive(k, k)
    Loop
    
End Sub
[/vba]

Смысл кода: есть таблица о трех колонках. Первая колонка: порядковый номер, вторая - имя, третья - фамилия. Количество строк все время меняется, потому и нужен динамический массив.


Сообщение отредактировал tsch - Среда, 01.02.2017, 17:48
 
Ответить
СообщениеДобрый день!
Подскажите, пожалуйста, как реализовать заполнение динамического массива. Приведенный ниже код не работает, ругается на ошибку синтаксиса в выражении massive(, k) = Cells(i, 3).Value(), а как сделать так, чтобы не ругался, тяму не хватает. С одномерным массивом все работает корректно.

[vba]
Код
Sub massiveTest()
    Dim i, k As Integer
    ReDim massive(0, 0) As String
    i = 2
    k = 0
    
    Do While Cells(i, 1) <> 0
        k = k + 1
        ReDim Preserve massive(k, k) As String
        massive(k) = Cells(i, 2).Value()
        massive(, k) = Cells(i, 3).Value()
        i = i + 1
        MsgBox massive(k, k)
    Loop
    
End Sub
[/vba]

Смысл кода: есть таблица о трех колонках. Первая колонка: порядковый номер, вторая - имя, третья - фамилия. Количество строк все время меняется, потому и нужен динамический массив.

Автор - tsch
Дата добавления - 01.02.2017 в 17:45
_Boroda_ Дата: Среда, 01.02.2017, 17:55 | Сообщение № 2
Группа: Модераторы
Ранг: Местный житель
Сообщений: 16675
Репутация: 6481 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
Может, Вам вот так подойдет?
[vba]
Код
Sub tt()
   ar = Range("A1:C" & Range("A" & Rows.Count).End(xlUp).Row)
End Sub
[/vba]


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеМожет, Вам вот так подойдет?
[vba]
Код
Sub tt()
   ar = Range("A1:C" & Range("A" & Rows.Count).End(xlUp).Row)
End Sub
[/vba]

Автор - _Boroda_
Дата добавления - 01.02.2017 в 17:55
tsch Дата: Среда, 01.02.2017, 18:18 | Сообщение № 3
Группа: Пользователи
Ранг: Новичок
Сообщений: 15
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
_Boroda_, что-то как-то слишком просто получается :(
Но похоже на правду, спасибо!
 
Ответить
Сообщение_Boroda_, что-то как-то слишком просто получается :(
Но похоже на правду, спасибо!

Автор - tsch
Дата добавления - 01.02.2017 в 18:18
tsch Дата: Среда, 01.02.2017, 18:45 | Сообщение № 4
Группа: Пользователи
Ранг: Новичок
Сообщений: 15
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
_Boroda_, можно еще один вопрос в рамках решения все той же задачи?

[vba]
Код
Sub massiveTest()
    arr = Range("B2:C" & Range("A" & Rows.Count).End(xlUp).Row)
    arrLength = UBound(arr) - LBound(arr) + 1
    
    Const writeFile As String = "C:\Intel\test.txt"
    'Dim i As Integer
    
    Open writeFile For Output As #1
        For i = 1 To arrLength Step 1
            Print #1, arr(i, 1) & " " & arr(i, 2)
        Next i
    Close #1
    
End Sub
[/vba]

Почему-то в файл записывается на одну строчку больше, чем длина массива, хотя в дебаггере четко видно, что на i=5 (например), происходит выход из цикла, но строчке в файле получается 6. Я честно пробовал во всех местах -1 подставить, но тогда на одну строчку меньше выходит и все равно с пустой строкой.
 
Ответить
Сообщение_Boroda_, можно еще один вопрос в рамках решения все той же задачи?

[vba]
Код
Sub massiveTest()
    arr = Range("B2:C" & Range("A" & Rows.Count).End(xlUp).Row)
    arrLength = UBound(arr) - LBound(arr) + 1
    
    Const writeFile As String = "C:\Intel\test.txt"
    'Dim i As Integer
    
    Open writeFile For Output As #1
        For i = 1 To arrLength Step 1
            Print #1, arr(i, 1) & " " & arr(i, 2)
        Next i
    Close #1
    
End Sub
[/vba]

Почему-то в файл записывается на одну строчку больше, чем длина массива, хотя в дебаггере четко видно, что на i=5 (например), происходит выход из цикла, но строчке в файле получается 6. Я честно пробовал во всех местах -1 подставить, но тогда на одну строчку меньше выходит и все равно с пустой строкой.

Автор - tsch
Дата добавления - 01.02.2017 в 18:45
bmv98rus Дата: Среда, 01.02.2017, 19:45 | Сообщение № 5
Группа: Друзья
Ранг: Участник клуба
Сообщений: 4107
Репутация: 768 ±
Замечаний: 0% ±

Excel 2013/2016
tsch,

вам точно нужно это [vba]
Код
Range("A" & Rows.Count).
[/vba]? Просто в указанно примере там диапазон A1:C , а у вас B2:c
Это зачем? [vba]
Код
arrLength = UBound(arr) - LBound(arr) + 1
[/vba] достаточно [vba]
Код
arrLength=UBound(arr)
[/vba]
[vba]
Код
For i = 1 To arrLength Step 1
[/vba] если боятся что массив не с 1 начинается то [vba]
Код
For i = LBound(arr) To UBound(arr)
[/vba] Step 1 - по умолчанию. Но это мелочи.

Почему-то в файл записывается на одну строчку больше
значимую или это просто перевод строки вы воспринимаете как строку лишнюю?
Даже с вашим кодом все работает нормально. Или прикладывайте ваш файл.


Замечательный Временно просто медведь , процентов на 20.

Сообщение отредактировал bmv98rus - Среда, 01.02.2017, 19:46
 
Ответить
Сообщениеtsch,

вам точно нужно это [vba]
Код
Range("A" & Rows.Count).
[/vba]? Просто в указанно примере там диапазон A1:C , а у вас B2:c
Это зачем? [vba]
Код
arrLength = UBound(arr) - LBound(arr) + 1
[/vba] достаточно [vba]
Код
arrLength=UBound(arr)
[/vba]
[vba]
Код
For i = 1 To arrLength Step 1
[/vba] если боятся что массив не с 1 начинается то [vba]
Код
For i = LBound(arr) To UBound(arr)
[/vba] Step 1 - по умолчанию. Но это мелочи.

Почему-то в файл записывается на одну строчку больше
значимую или это просто перевод строки вы воспринимаете как строку лишнюю?
Даже с вашим кодом все работает нормально. Или прикладывайте ваш файл.

Автор - bmv98rus
Дата добавления - 01.02.2017 в 19:45
tsch Дата: Четверг, 02.02.2017, 10:34 | Сообщение № 6
Группа: Пользователи
Ранг: Новичок
Сообщений: 15
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
bmv98rus, "Даже с вашим кодом все работает нормально." - ну, не такой уж и позорный у меня код. :(

Да, я перевод строки воспринимаю, как лишнюю строчку. Я уже потом, когда сформированный файл вертел дальше по назначению, понял, что на работоспособность это не влияет, но если можно избежать лишней строки, то было бы совсем хорошо.

[vba]
Код
Range("A" & Rows.Count).
[/vba]
Нужен, мне же надо что-то в массив складывать. Или речь о том, почему у _Boroda_ А1, а у меня B2? Тогда отвечу: если оставлять А1, то в массив складываются названия колонок, а мне они в массиве не нужны. Или вопрос в том, что если я меняю A1:C на B2:C, то мне и Range("A" & Rows.Count) на Range("B" & Rows.Count) надо поменять? Суть в том, что мне ни названия колонок, ни порядковый номер в массиве оказались не нужны, только имя и фамилия, а порядковым номером выступает место в массиве.

[vba]
Код
arrLength = UBound(arr) - LBound(arr) + 1
достаточно
arrLength=UBound(arr)
[/vba]
Ну, что в интернетах пишут, то и скопипастил.
 
Ответить
Сообщениеbmv98rus, "Даже с вашим кодом все работает нормально." - ну, не такой уж и позорный у меня код. :(

Да, я перевод строки воспринимаю, как лишнюю строчку. Я уже потом, когда сформированный файл вертел дальше по назначению, понял, что на работоспособность это не влияет, но если можно избежать лишней строки, то было бы совсем хорошо.

[vba]
Код
Range("A" & Rows.Count).
[/vba]
Нужен, мне же надо что-то в массив складывать. Или речь о том, почему у _Boroda_ А1, а у меня B2? Тогда отвечу: если оставлять А1, то в массив складываются названия колонок, а мне они в массиве не нужны. Или вопрос в том, что если я меняю A1:C на B2:C, то мне и Range("A" & Rows.Count) на Range("B" & Rows.Count) надо поменять? Суть в том, что мне ни названия колонок, ни порядковый номер в массиве оказались не нужны, только имя и фамилия, а порядковым номером выступает место в массиве.

[vba]
Код
arrLength = UBound(arr) - LBound(arr) + 1
достаточно
arrLength=UBound(arr)
[/vba]
Ну, что в интернетах пишут, то и скопипастил.

Автор - tsch
Дата добавления - 02.02.2017 в 10:34
bmv98rus Дата: Четверг, 02.02.2017, 11:04 | Сообщение № 7
Группа: Друзья
Ранг: Участник клуба
Сообщений: 4107
Репутация: 768 ±
Замечаний: 0% ±

Excel 2013/2016
но если можно избежать лишней строки, то было бы совсем хорошо

там нет лишней строки просто последний символ выводимой строки - это как раз симол перевода строки. В редакторе вы видете, что есть пустая строка, но это только визуализация.

Ну и я не хотел унижать, просто подтвердил что код работает нормально, и придирки не влияют на конечный результат.


Замечательный Временно просто медведь , процентов на 20.

Сообщение отредактировал bmv98rus - Четверг, 02.02.2017, 11:06
 
Ответить
Сообщение
но если можно избежать лишней строки, то было бы совсем хорошо

там нет лишней строки просто последний символ выводимой строки - это как раз симол перевода строки. В редакторе вы видете, что есть пустая строка, но это только визуализация.

Ну и я не хотел унижать, просто подтвердил что код работает нормально, и придирки не влияют на конечный результат.

Автор - bmv98rus
Дата добавления - 02.02.2017 в 11:04
_Boroda_ Дата: Четверг, 02.02.2017, 11:12 | Сообщение № 8
Группа: Модераторы
Ранг: Местный житель
Сообщений: 16675
Репутация: 6481 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
если я меняю A1:C на B2:C, то мне и Range("A" & Rows.Count) на Range("B" & Rows.Count) надо поменять?
Да. Вдруг получится так, что в А у Вас 20 строк, а в В 19? Ну мало ли, всякое бывает ...

Немного поясню про массив. Если мы берем массив приравниванием с листа , то этот массив начинается с единицы (если явно не указано иное - у нас не указано, да и зачем?). Поэтому UBound LBound этого массива мы знаем заранее и нет нужды еще раз его определять. Определить можно, но зачем ?


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
Сообщение
если я меняю A1:C на B2:C, то мне и Range("A" & Rows.Count) на Range("B" & Rows.Count) надо поменять?
Да. Вдруг получится так, что в А у Вас 20 строк, а в В 19? Ну мало ли, всякое бывает ...

Немного поясню про массив. Если мы берем массив приравниванием с листа , то этот массив начинается с единицы (если явно не указано иное - у нас не указано, да и зачем?). Поэтому UBound LBound этого массива мы знаем заранее и нет нужды еще раз его определять. Определить можно, но зачем ?

Автор - _Boroda_
Дата добавления - 02.02.2017 в 11:12
bmv98rus Дата: Четверг, 02.02.2017, 11:30 | Сообщение № 9
Группа: Друзья
Ранг: Участник клуба
Сообщений: 4107
Репутация: 768 ±
Замечаний: 0% ±

Excel 2013/2016
Поэтому UBound этого массива мы знаем заранее
Александр, этого не понял. Применительно к данному примеру - не знаем. Или строки посчитать или размер масива.


Замечательный Временно просто медведь , процентов на 20.
 
Ответить
Сообщение
Поэтому UBound этого массива мы знаем заранее
Александр, этого не понял. Применительно к данному примеру - не знаем. Или строки посчитать или размер масива.

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

2003; 2007; 2010; 2013 RUS
А что тут непонятного-то? Все просто - мне лень было вручную набирать и я скопировал из кода выше. А скопировал не UBound, а LBound (да какая разница-то? Мелочи какие :D
Спасибо, поправил у себя выше


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеА что тут непонятного-то? Все просто - мне лень было вручную набирать и я скопировал из кода выше. А скопировал не UBound, а LBound (да какая разница-то? Мелочи какие :D
Спасибо, поправил у себя выше

Автор - _Boroda_
Дата добавления - 02.02.2017 в 11:43
tsch Дата: Четверг, 02.02.2017, 16:06 | Сообщение № 11
Группа: Пользователи
Ранг: Новичок
Сообщений: 15
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
_Boroda_, bmv98rus, спасибо за разъяснения и комментарии.
 
Ответить
Сообщение_Boroda_, bmv98rus, спасибо за разъяснения и комментарии.

Автор - tsch
Дата добавления - 02.02.2017 в 16:06
Piru Дата: Пятница, 28.04.2017, 09:32 | Сообщение № 12
Группа: Пользователи
Ранг: Прохожий
Сообщений: 5
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Ребята подскажите пожалуйста, что с этим кодом не так??? Как только row_num = 9 выскакивает ошибка

Sub Massiv()

Dim DynMas() As Variant
Dim File_Path As String

File_Path = "C:\Users\Admin\Desktop\Maz T044SS (OOO NPP SGT).txt"
row_num = 1
ReDim DynMas(1 To row_num, 1 To 5)
Open File_Path For Input As #1

Do Until EOF(1)
Line Input #1, Line_FromFile
Line_Items = Split(Line_FromFile, ",")
If row_num > 7 Then
For i = 1 To 5
DynMas(UBound(DynMas, 1), i) = Line_Items(i - 1)
Next i
ReDim Preserve DynMas(1 To UBound(DynMas, 1) + 1, 1 To 5)
End If

row_num = row_num + 1
Loop
Close #1
End Sub


Остановите эту планету! Я сойду.
 
Ответить
СообщениеРебята подскажите пожалуйста, что с этим кодом не так??? Как только row_num = 9 выскакивает ошибка

Sub Massiv()

Dim DynMas() As Variant
Dim File_Path As String

File_Path = "C:\Users\Admin\Desktop\Maz T044SS (OOO NPP SGT).txt"
row_num = 1
ReDim DynMas(1 To row_num, 1 To 5)
Open File_Path For Input As #1

Do Until EOF(1)
Line Input #1, Line_FromFile
Line_Items = Split(Line_FromFile, ",")
If row_num > 7 Then
For i = 1 To 5
DynMas(UBound(DynMas, 1), i) = Line_Items(i - 1)
Next i
ReDim Preserve DynMas(1 To UBound(DynMas, 1) + 1, 1 To 5)
End If

row_num = row_num + 1
Loop
Close #1
End Sub

Автор - Piru
Дата добавления - 28.04.2017 в 09:32
Manyasha Дата: Пятница, 28.04.2017, 12:00 | Сообщение № 13
Группа: Модераторы
Ранг: Старожил
Сообщений: 2198
Репутация: 898 ±
Замечаний: 0% ±

Excel 2010, 2016
Piru, прочитайте Правила форума и создайте свою тему. Эта тема закрыта.


ЯД: 410013299366744 WM: R193491431804
 
Ответить
СообщениеPiru, прочитайте Правила форума и создайте свою тему. Эта тема закрыта.

Автор - Manyasha
Дата добавления - 28.04.2017 в 12:00
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Динамическое заполнение двумерного массива (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

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