Зараз обговорюють

"Тобто є ряд завдань, які взагалі без рекурсії не наважуються."  - це як розуміти? Перефразуй, будь ласка. 

виправив, йшлося про те що деякі завдання можна вирішити лише при використанні рекурсії

Спасибі дуже корисна стаття

А ще щось планується подібного найближчим часом?


Дякую за підтримку, радий що Вам сподобалось!

Так маю вже майже дороблений проект по управлінні Audio файлом, на заміну стандартним клавішам управління HTML5, але ще не встиг відтестувати програвання файлів з інтернету, поки лише локально працює

Надіюсь найближчим часом дороблю й закину

Рахунки

webmoneyeur - E385818210641
usd - Z304643423050
uah - U354026817492
rub - R301704373231easypay80002677bitcoin1F5HRGroUtEQW9HBNbeew8iKh5KQ8vJxzw

Зворотній зв'язок

Для покращення роботи сайту надсилайте свої зауваження:
mailЗауваження
mailПропозиція

Статистика

UkrNET - поисково-информационный ресурс

VBA : Робота з масивами в MS Excel. Переводимо Range в масив даних

В даній статті ми розглянемо способи наповнення та виведення інформації з масиву.

Примітка: Тут ми розглянемо лише специфічну частину для MS Excel, але Ви також можете використовувати вже раніше розглянуті методи роботи з масивами які є загальними для VBA

В Excel є два способи передати дані з осередків в масив, тож розглянемо їх на прикладі:

На аркуші маємо набір значень розміром 60000х5, необхідно визначити які із значень діляться на 2 без остачі і залишити їх без змін, а решту змінити на 0

Виконання без використання масиву

Sub method0()
Dim startTime As Variant, endTime As Variant
Dim maxRow As Long, maxColumn As Long, i As Long, j As Long
    startTime = Time
    If ThisWorkbook.Sheets("I").Cells(1, 1).Value <> 0 Then
		'визначаємо к-ть рядків'
        maxRow = ThisWorkbook.Sheets("I").Range("A1").End(xlDown).Row
		'визначаємо к-ть стовпців'
        maxColumn = ThisWorkbook.Sheets("I").Range("A1").End(xlToRight).Column
        For i = 1 To maxRow
            For j = 1 To maxColumn
                If ThisWorkbook.Sheets("I").Cells(i, j).Value Mod 2 <> 0 Then ThisWorkbook.Sheets("I").Cells(i, j).Value = 0
            Next j
        Next i
    End If
    endTime = Time
    MsgBox "Час виконання: " & Format(endTime - startTime, "h:mm:ss:ms"), vbInformation + vbOKOnly, ""
    Debug.Print "Метод 0: " & Format(endTime - startTime, "h:mm:ss:ms")
End Sub 

Час затрачений на виконання даного коду 6-7 секунд, так як VBA кожного разу звертається до конкретного осередку, що займає більше часу ніж звернення до елементу масиву


Перший спосіб

Даний спосіб копіює дані з осередків в оперативну память і в подальшому немає зв'язку з даними осередками.

Sub method1()
Dim startTime As Variant, endTime As Variant
Dim maxRow As Long, maxColumn As Long, i As Long, j As Long
Dim matrix() As Variant
    startTime = Time
    If ThisWorkbook.Sheets("I").Cells(1, 1).Value <> 0 Then
		'визначаємо к-ть рядків'
        maxRow = ThisWorkbook.Sheets("I").Range("A1").End(xlDown).Row
		'визначаємо к-ть стовпців'
        maxColumn = ThisWorkbook.Sheets("I").Range("A1").End(xlToRight).Column
		'переоголошуємо масив із потрібним розміром'
        ReDim matrix(1 To maxRow, 1 To maxColumn)
		'наповнюємо масив значеннями'
        matrix = ThisWorkbook.Sheets("I").Range(Cells(1, 1), Cells(maxRow, maxColumn)).Value
        For i = 1 To maxRow
            For j = 1 To maxColumn
				'якщо після ділення залишається остача то в відповідній клітинці проставити 0'
                If matrix(i, j) Mod 2 <> 0 Then ThisWorkbook.Sheets("I").Cells(i, j).Value = 0
            Next j
        Next i
        Erase matrix
    End If
    endTime = Time
    MsgBox "Час виконання: " & Format(endTime - startTime, "h:mm:ss:ms"), vbInformation + vbOKOnly, ""
    Debug.Print "Метод 1: " & Format(endTime - startTime, "h:mm:ss:ms")
End Sub 

Час затрачений на виконання даного коду 4 секунди

Недолік першого методу

Після обробки даних масиву потрібно використати цикл, щоб вивести дані на аркуш.

Перевага першого методу

Ви отримуєте копію даних без загроз пошкодження первинної інформації.

Примітка: Якщо непотрібно вносити зміни в дані які записуються в масив після опрацювання то доцільніше буде використати даний метод, так як будь-які зміни в даних масиву не будуть впливати на первинні дані.


Другий спосіб

Даний спосіб копіює дані з осередків в оперативну память і залишає зв'язок з даними осередками (прямий доступ до осередку).

Sub method2()
Dim startTime As Variant, endTime As Variant
Dim maxRow As Long, maxColumn As Long, i As Long, j As Long
Dim matrix As Object
    startTime = Time
    If ThisWorkbook.Sheets("II").Cells(1, 1).Value <> 0 Then
		'визначаємо к-ть рядків'
        maxRow = ThisWorkbook.Sheets("II").Range("A1").End(xlDown).Row
		'визначаємо к-ть стовпців'
        maxColumn = ThisWorkbook.Sheets("II").Range("A1").End(xlToRight).Column
		'присвоюємо нашій matrix діапазон даних'
        Set matrix = Range(ThisWorkbook.Sheets("II").Cells(1, 1), ThisWorkbook.Sheets("II").Cells(maxRow, maxColumn))
        For i = 1 To maxRow
            For j = 1 To maxColumn
				'якщо після ділення залишається остача то в відповідній клітинці проставити 0'
                If matrix(i, j) Mod 2 <> 0 Then matrix(i, j) = 0
            Next j
        Next i
        Set matrix = Nothing
    End If
    endTime = Time
    MsgBox "Час виконання: " & Format(endTime - startTime, "h:mm:ss:ms"), vbInformation + vbOKOnly, ""
    Debug.Print "Метод 2: " & Format(endTime - startTime, "h:mm:ss:ms")
End Sub 

Час затрачений на виконання даного коду 4 секунди

Недолік другого методу

Треба бути обережним при зміні даних бо якщо код ще не відтестований і викличе на певному кроці помилку то частина первинних даних може бути втраченою.

Перевага другого методу

У нас є прямий доступ до осередків і для виведення даних не потрібно проходити додатковий цикл.

Примітка: Якщо потрібно вносити зміни в дані які записуються в масив після опрацювання то доцільніше буде використати даний метод, так як будь-які зміни в даних масиву одразу ж будуть внесені в відповідний осередок первинних даних.

Завантажити файл з прикладами:

Завантажити з Завантажити з


view505like1dislike0 avatard_l4w clock 2016-09-01 17:51

Коментарі:



Для даної статті відсутні коментарі

Про нас

"Programmers World" розроблено з метою полегшення в освоєнні навичок програмування, та поширення матеріалів з сфери ІТ Українською мовою.

Кожен бажаючий може безкоштовно користуватися ресурсами сайту, щоб:

- Вивчати теоретичні аспекти мов програмування

- Переглядати практичне застосування теорії при виконанні різних міні проектів з відкритим кодом

- Розміщати свої завдання на форумі для допомоги в їх реалізації, або готового коду який може бути корисний іншим користувачам

- Спілкуватись з іншими користувачами та обмінюватись досвідом

Сайт функціонує на безопланій основі та ентузіазмі розробника, якщо Ви бажаєте долучитись до розвитку даного проекту то можете пожертвувати кошти на рахунки розміщені в блоці "Допомога сайту".

Сайт

Зареєстровані користувачі можуть скористатися системою діалогів, в профілі користувача, для отримання потрібної інформації. Написати!

Також Ви можете використати форми відправки Зауважень та Пропозицій.


Електронна пошта

Ви можете звертатись на нашу поштову скриньку site.programmersworld@gmail.com

www.000webhost.com