И раз речь о массивах, то рано или поздно станет вопрос их сортировки. Нашел, как-то статью, которая очень сильно помогла в понимании алгоритмов: http://habrahabr.ru/post/204600/
Еще картинку подготовил:
И раз речь о массивах, то рано или поздно станет вопрос их сортировки. Нашел, как-то статью, которая очень сильно помогла в понимании алгоритмов: http://habrahabr.ru/post/204600/SkyPro
'Хотел задать массив нужного размера, но он хочет константу...
[vba]
Код
Sub изменить_размер_массива() Dim x Dim v: v = 10 ReDim x(1) 'меняем верхнюю границу (нижнюю нельзя) MsgBox "Нижняя граница массива = " & LBound(x) & vbNewLine & "Верхняя граница массива = " & UBound(x) ReDim x(v) 'меняем верхнюю границу на значение переменной v. MsgBox "Нижняя граница массива = " & LBound(x) & vbNewLine & "Верхняя граница массива = " & UBound(x) End Sub
[/vba]
Цитата
'Хотел задать массив нужного размера, но он хочет константу...
[vba]
Код
Sub изменить_размер_массива() Dim x Dim v: v = 10 ReDim x(1) 'меняем верхнюю границу (нижнюю нельзя) MsgBox "Нижняя граница массива = " & LBound(x) & vbNewLine & "Верхняя граница массива = " & UBound(x) ReDim x(v) 'меняем верхнюю границу на значение переменной v. MsgBox "Нижняя граница массива = " & LBound(x) & vbNewLine & "Верхняя граница массива = " & UBound(x) End Sub
Штудируйте "Как писать нечитаемый код" в этой же ветке. Счетчики - i, j, k. Переменным желательно присваивать осознанные имена. For R = 4 To X - лучше For i = 1 To lRws - 3 Часть названия переменной должна указывать на ее тип, например: lRws - Long, ArrPrefix - массив. Массив для этой задачи лучше двумерный, для всей таблицы. Т.к. обработка данных одного листа, можно поместить в модуль листа. Переменные обычно объявляются сразу после названия процедуры. От этого правила иногда отступаю (для экономии памяти), например: обработка событий листа и переменные нужны только при выполнении части кода.
Штудируйте "Как писать нечитаемый код" в этой же ветке. Счетчики - i, j, k. Переменным желательно присваивать осознанные имена. For R = 4 To X - лучше For i = 1 To lRws - 3 Часть названия переменной должна указывать на ее тип, например: lRws - Long, ArrPrefix - массив. Массив для этой задачи лучше двумерный, для всей таблицы. Т.к. обработка данных одного листа, можно поместить в модуль листа. Переменные обычно объявляются сразу после названия процедуры. От этого правила иногда отступаю (для экономии памяти), например: обработка событий листа и переменные нужны только при выполнении части кода.vikttur
Сообщение отредактировал vikttur - Вторник, 10.06.2014, 15:08
Sub изменить_размер_массива() Dim x Dim rRange As Range Dim r&, c& Set rRange = [a1:b4]
' заполним диапазон значением строки и столбца For r = 1 To rRange.Rows.Count For c = 1 To rRange.Columns.Count rRange(r, c) = "строка " & r & "|столбец " & c Next Next
x = rRange.Value 'копируем из диапазона ячеек в двумерный массив. ' проходим по массиву For r = 1 To UBound(x) 'если таким способом заполнять массив, то нижняя граница = 1 For c = 1 To UBound(x, 2) 'получаем верхнюю границу второй размерности (кол-во столбцов) Debug.Print x(r, c) Next Next
End Sub
[/vba]
[vba]
Код
Sub изменить_размер_массива() Dim x Dim rRange As Range Dim r&, c& Set rRange = [a1:b4]
' заполним диапазон значением строки и столбца For r = 1 To rRange.Rows.Count For c = 1 To rRange.Columns.Count rRange(r, c) = "строка " & r & "|столбец " & c Next Next
x = rRange.Value 'копируем из диапазона ячеек в двумерный массив. ' проходим по массиву For r = 1 To UBound(x) 'если таким способом заполнять массив, то нижняя граница = 1 For c = 1 To UBound(x, 2) 'получаем верхнюю границу второй размерности (кол-во столбцов) Debug.Print x(r, c) Next Next
Ребят, использовал Ваши советы и переделал код в угоду гибкости, какой - отражено в файле.
[vba]
Код
Option Explicit Option Base 1
Sub Item_Generator()
Application.ScreenUpdating = False With ThisWorkbook.Sheets(1)
Dim X As Long 'How much Prefixes do we have? Dim Y As Long 'How much Items do we have? Dim Z As Long 'How much Postfixes do we have? Dim i As Long 'To make circles run.
Dim Prefix Dim Item Dim Postfix
'Measuring our arrays X = .Cells(Rows.Count, 1).End(xlUp).Row Y = .Cells(Rows.Count, 2).End(xlUp).Row Z = .Cells(Rows.Count, 3).End(xlUp).Row
'Putting arrays to a proper condition ReDim Prefix(X - 3) ReDim Item(Y - 3) ReDim Postfix(Z - 3)
'Loading values to arrays
For i = 4 To X Prefix(i - 3) = .Cells(i, 1).Value Next i
For i = 4 To Y Item(i - 3) = .Cells(i, 2).Value Next i
For i = 4 To Z Postfix(i - 3) = .Cells(i, 3).Value Next i
End With Application.ScreenUpdating = True End Sub
[/vba] SkyPro, ikki, пока не знаю, зачем может понадобиться сортировка массива, но заметку делаю, что для профи сортировка важна. Мне больше нравится шейкерная пока.
vikttur, статью про нечитабельный код читал пару дней назад, понравилась =) С некоторыми формальными правилами знаком, постепенно внедряю. Но пока вроде не пишу ничего достаточно серьёзного, чтобы держаться полностью "официального" стиля.
Ребят, использовал Ваши советы и переделал код в угоду гибкости, какой - отражено в файле.
[vba]
Код
Option Explicit Option Base 1
Sub Item_Generator()
Application.ScreenUpdating = False With ThisWorkbook.Sheets(1)
Dim X As Long 'How much Prefixes do we have? Dim Y As Long 'How much Items do we have? Dim Z As Long 'How much Postfixes do we have? Dim i As Long 'To make circles run.
Dim Prefix Dim Item Dim Postfix
'Measuring our arrays X = .Cells(Rows.Count, 1).End(xlUp).Row Y = .Cells(Rows.Count, 2).End(xlUp).Row Z = .Cells(Rows.Count, 3).End(xlUp).Row
'Putting arrays to a proper condition ReDim Prefix(X - 3) ReDim Item(Y - 3) ReDim Postfix(Z - 3)
'Loading values to arrays
For i = 4 To X Prefix(i - 3) = .Cells(i, 1).Value Next i
For i = 4 To Y Item(i - 3) = .Cells(i, 2).Value Next i
For i = 4 To Z Postfix(i - 3) = .Cells(i, 3).Value Next i
End With Application.ScreenUpdating = True End Sub
[/vba] SkyPro, ikki, пока не знаю, зачем может понадобиться сортировка массива, но заметку делаю, что для профи сортировка важна. Мне больше нравится шейкерная пока.
vikttur, статью про нечитабельный код читал пару дней назад, понравилась =) С некоторыми формальными правилами знаком, постепенно внедряю. Но пока вроде не пишу ничего достаточно серьёзного, чтобы держаться полностью "официального" стиля.Rioran
Виктор, раз Dim написал - то переменная уже память отъела. Проверь пошагово. Другое дело что так её можно элегантно обнулить, ну и удобнее если копипастишь блок кода - сразу всё что нужно выделил и закопипастил в другой макрос.
Виктор, раз Dim написал - то переменная уже память отъела. Проверь пошагово. Другое дело что так её можно элегантно обнулить, ну и удобнее если копипастишь блок кода - сразу всё что нужно выделил и закопипастил в другой макрос.Hugo
А я не экономный. Обьявляю переменные сразу. Так (во всяком случае мне) понятнее. Хотя на скорую руку могу и прям перед "заплаткой" обьявить. А память.. памяти то уже гигабайты. Чего её экономить? )
А я не экономный. Обьявляю переменные сразу. Так (во всяком случае мне) понятнее. Хотя на скорую руку могу и прям перед "заплаткой" обьявить. А память.. памяти то уже гигабайты. Чего её экономить? )SkyPro
Именно об этом и написал. Код сообщения №24 - нет никакого смысла сдвигать переменные вниз, здесь "димам" самое место сверху. Но если переменная используется только в части кода:
Именно об этом и написал. Код сообщения №24 - нет никакого смысла сдвигать переменные вниз, здесь "димам" самое место сверху. Но если переменная используется только в части кода:
[offtop]Мой первый язык, который я пытался постичь - ассемблер, потом бейсик. Это когда собирали Радио-86РК и Синклеры. Хотелось не только паяльником и цифровой логикой владеть. Но программирование тогда не смогло победить мою непонятливость.[/offtop]
Цитата
Наследие изучения Pascal?
[offtop]Мой первый язык, который я пытался постичь - ассемблер, потом бейсик. Это когда собирали Радио-86РК и Синклеры. Хотелось не только паяльником и цифровой логикой владеть. Но программирование тогда не смогло победить мою непонятливость.[/offtop]vikttur