Добрый день! Подскажите, пожалуйста, как реализовать заполнение динамического массива. Приведенный ниже код не работает, ругается на ошибку синтаксиса в выражении 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]
Смысл кода: есть таблица о трех колонках. Первая колонка: порядковый номер, вторая - имя, третья - фамилия. Количество строк все время меняется, потому и нужен динамический массив.
Добрый день! Подскажите, пожалуйста, как реализовать заполнение динамического массива. Приведенный ниже код не работает, ругается на ошибку синтаксиса в выражении 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
Сообщение отредактировал tsch - Среда, 01.02.2017, 17:48
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_, можно еще один вопрос в рамках решения все той же задачи?
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
Почему-то в файл записывается на одну строчку больше
значимую или это просто перевод строки вы воспринимаете как строку лишнюю? Даже с вашим кодом все работает нормально. Или прикладывайте ваш файл.bmv98rus
Замечательный Временно просто медведь , процентов на 20.
Сообщение отредактировал bmv98rus - Среда, 01.02.2017, 19:46
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
но если можно избежать лишней строки, то было бы совсем хорошо
там нет лишней строки просто последний символ выводимой строки - это как раз симол перевода строки. В редакторе вы видете, что есть пустая строка, но это только визуализация.
Ну и я не хотел унижать, просто подтвердил что код работает нормально, и придирки не влияют на конечный результат.
но если можно избежать лишней строки, то было бы совсем хорошо
там нет лишней строки просто последний символ выводимой строки - это как раз симол перевода строки. В редакторе вы видете, что есть пустая строка, но это только визуализация.
Ну и я не хотел унижать, просто подтвердил что код работает нормально, и придирки не влияют на конечный результат.bmv98rus
Замечательный Временно просто медведь , процентов на 20.
Сообщение отредактировал bmv98rus - Четверг, 02.02.2017, 11:06
если я меняю A1:C на B2:C, то мне и Range("A" & Rows.Count) на Range("B" & Rows.Count) надо поменять?
Да. Вдруг получится так, что в А у Вас 20 строк, а в В 19? Ну мало ли, всякое бывает ...
Немного поясню про массив. Если мы берем массив приравниванием с листа , то этот массив начинается с единицы (если явно не указано иное - у нас не указано, да и зачем?). Поэтому UBound LBound этого массива мы знаем заранее и нет нужды еще раз его определять. Определить можно, но зачем ?
если я меняю A1:C на B2:C, то мне и Range("A" & Rows.Count) на Range("B" & Rows.Count) надо поменять?
Да. Вдруг получится так, что в А у Вас 20 строк, а в В 19? Ну мало ли, всякое бывает ...
Немного поясню про массив. Если мы берем массив приравниванием с листа , то этот массив начинается с единицы (если явно не указано иное - у нас не указано, да и зачем?). Поэтому UBound LBound этого массива мы знаем заранее и нет нужды еще раз его определять. Определить можно, но зачем ?_Boroda_
А что тут непонятного-то? Все просто - мне лень было вручную набирать и я скопировал из кода выше. А скопировал не UBound, а LBound (да какая разница-то? Мелочи какие Спасибо, поправил у себя выше
А что тут непонятного-то? Все просто - мне лень было вручную набирать и я скопировал из кода выше. А скопировал не UBound, а LBound (да какая разница-то? Мелочи какие Спасибо, поправил у себя выше_Boroda_
Ребята подскажите пожалуйста, что с этим кодом не так??? Как только 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