Excel vba умная таблица в массив

Копирование значений из диапазона ячеек в массив и обратно с помощью VBA Excel. Простейшие примеры обмена значениями между диапазоном и массивом.

Как известно, VBA обрабатывает информацию в массивах значительно быстрее, чем в ячейках рабочего листа Excel. Поэтому, при работе с большими объемами данных, удобнее использовать массивы, чем наблюдать во время выполнения кода за мерцанием изображения на экране или просто смотреть в неизменную картинку, если обновление экрана отключено (Application.ScreenUpdating = False). Здесь обмен значениями между массивом и диапазоном ячеек будет вполне уместен.

Копирование значений из диапазона ячеек в массив

Чтобы скопировать значения из диапазона ячеек в массив, необходимо объявить переменную универсального типа (As Variant) и присвоить ей значения диапазона ячеек с помощью оператора присваивания (=):

Dim a As Variant

a = Range(«A1:C3»)

VBA Excel автоматически преобразует объявленную переменную в двумерный массив, соответствующий размерности диапазона ячеек, в нашем случае в массив — a(1 To 3, 1 To 3), и заполняет его значениями. Нумерация измерений массивов, созданных таким образом, начинается с единицы (1).

Можно, в этом случае, объявить сразу динамический массив, чтобы изначально указать, что эта переменная будет массивом. Так как свойством диапазона ячеек по умолчанию в VBA Excel является значение (Value), его можно в коде явно не указывать, но, при желании, можно и указать. Получится такая конструкция, аналогичная первой:

Dim a() As Variant

a = Range(«A1:C3»).Value

Стоит отметить, что для копирования значений из диапазона ячеек в массив можно использовать только обычную переменную или динамический массив универсального типа (Variant). VBA Excel автоматически преобразовывает их в двумерный массив. Если объявить двумерный массив с указанной заранее размерностью, использовать его не получится, будет сгенерирована ошибка с сообщением: Can’t assign to array (Нельзя назначать массив).

Копирование значений из массива в диапазон ячеек

Значения в диапазон ячеек добавляются из массива с помощью оператора присваивания (=):

Range(«A6:F15») = a

‘или

Range(«A6:F15»).Value = a

‘где a — переменная двумерного массива

Обратите внимание, что вставить значения в диапазон ячеек можно только из двумерного массива. Размерность такого массива может начинаться с нуля (0). Количество элементов в измерениях массива должно совпадать с количеством строк и столбцов в диапазоне ячеек. Если вам нужно вставить значения в одну строку или в один столбец, укажите размерность единственной строки или единственного столбца как (0) или (1 To 1), если вы хотите использовать нумерацию измерений своего массива с единицы. Например, для записи десяти значений из массива в одну строку можно объявить такой массив — massiv(9, 0), или в один столбец — massiv(0, 9).

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

Обмен значениями между двумя диапазонами

Обмен значениями можно осуществить в VBA Excel не только между массивом и диапазоном, но и между двумя диапазонами одинаковой размерности:

Range(«B2:D6») = Range(«G7:I11»).Value

У диапазона, являющегося источником значений, обязательно должно быть указано свойство Value.

Если диапазон ячеек, принимающий значения, по размеру меньше диапазона-источника, то он будет заполнен полностью:

Range(«B2:D6») = Range(«G5:L13»).Value

Если принимающий диапазон ячеек по размеру больше передающего, то часть его будет заполнена значениями диапазона-источника, а остальные ячейки — значениями #Н/Д:

Range(«B2:D6») = Range(«G7:H9»).Value

Простейшие примеры обмена значениями

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

Пример 1

Заполнение двумерного массива значениями и и их присвоение диапазону ячеек на рабочем листе Excel:

Sub Test1()

Dim a(2, 2) As Variant

a(0, 0) = «телепузик»

a(0, 1) = «журналист»

a(0, 2) = «ящерица»

a(1, 0) = «короед»

a(1, 1) = «утенок»

a(1, 2) = «шмель»

a(2, 0) = 200

a(2, 1) = 300

a(2, 2) = 400

Range(«A1:C3»).Value = a

End Sub

В данном случае переменная массива не обязательно должна быть универсального типа (As Variant), например, если бы в нее записывались только текстовые данные, ее можно было бы объявить как строковую (As String), и все бы работало.

Пример 2

Объявление обычной переменной универсального типа, присвоение ей значений из диапазона ячеек «A1:C3», записанных кодом первого примера, и вставка этих значений из полученного двумерного массива в диапазон «D10:F12»:

Sub Test2()

Dim a As Variant

a = Range(«A1:C3»)

Range(«D10:F12») = a

End Sub

Естественно, указанные диапазоны ячеек расположены на активном листе.

Пример 3

Допустим, на рабочем листе «Лист1» в ячейках «A1:A5» записано количество какого-то товара, а в ячейках «B1:B5» — его цена. Необходимо к этой информации добавить сумму каждого товара, умножив количество на цену, и перенести данные на «Лист2».

Sub Test3()

Dim a As Variant, i As Long

  a = Лист1.Range(«A1:C5»)

    For i = 1 To 5

      a(i, 3) = a(i, 1) _

      * a(i, 2)

    Next

  Лист2.Range(«A1:C5») = a

End Sub

Массив создан сразу с размерностью 5×3 с элементами под суммы. Даже если на первом листе в ячейках «C1:C5» есть какие-то значения, в массиве они будут перезаписаны результатами вычислений.

Копирование значений из массива в массив

Этот пример показывает, как в VBA Excel можно скопировать значения из одного массива в другой:

Sub Test4()

Dim arr1, arr2

    arr1 = Range(«G7:I11»)

    arr2 = arr1

    Range(«B2:D6») = arr2

End Sub


Формулировка задачи:

Доброго времени!
Есть двухмерный массив:

Записываю в массив мою таблицу

Теперь я с ComboBox1 забираю условие фильтра

Теперь хочу в моём массиве найти записи с значением a

Помогите пожалуйста…!

Код к задаче: «Запись таблицы в массив, и вывод нужных вариантов»

textual

Листинг программы

Dim a(), i&, x&
Columns("A:B").Select
a = Selection.Value[/BASIC]
Перебрать все значения в массиве:
[BASIC]s=UserForm1.ComboBox1.Text
For i = 3 To UBound(a) ' Шапка из 2-х строк
 if a(i,1) = s then ' сравниваем по столбцу "А" если "B" то a(i,2) = s
  x= x+1 
 cells(x,4) = s 'Выводим в 4-й столбец 
cells(x,5) = a(i,1)
cells(x,6) = a(i,2)
 
 end if
Next

Автор alexey_ava, 07 декабря 2017, 10:47

Подскажите, пожалуйста, у меня есть «умная» таблица. Мне необходимо получить из неё данные по критериям — имя столбца и имя строки. В таблице Эксель данный вопрос решаю через ИНДЕКС и ПОИСКПОЗ:
{=ИНДЕКС(Таблица1[Значение на начало часа];ПОИСКПОЗ(C$2&$A3&$B3;Таблица1[[Тег ]]&Таблица1[Дата]&Таблица1[Час];0))}.

Попытался аналогично прописать в макросе — не получается:

[1] Range(«c3»).value = INDEX(Таблица1[Значение на начало часа],MATCH(R2C&RC1&RC2,Таблица1[Тег ]&Таблица1[Дата]&Таблица1[Час],0)) — не работает
[2] Range(«c3») = application.INDEX(Таблица1,application.MATCH(Cells(2, 3),Таблица1[Тег],0),application.MATCH(Cells(3, 1)&Cells(3, 2),Таблица1[Дата]&Таблица1[Час],0)) — не работает

Я понимаю, что [2] — скорее более правильная формула, но не могу добиться нормальной ссылки на столбец «умной» таблицы.
Просто вставлять формулу в ячейку нет смысла, она очень тормозит процесс.

Не могу нигде найти по этому поводу информацию.

[вложение удалено администратором]



Администратор

  • Administrator
  • Сообщения: 2,251
  • Записан

Эксель-функции вида «application.INDEX» в данном случае не получится использовать в макросе, т.к. у вас формула массива. Макросу как-то надо указать, что нужно использовать эксель-функции так, как если бы используется формула массива, но такое сделать нельзя.

Остаётся два варианта:
1) Вставка формулы в ячейку, а затем превращение её в значение. В этом случае можно попробовать использовать:
ActiveCell.FormulaArray
2) Делать те же действия, что делает ваша формула, но без использования формул, а какими-нибудь другими способами: в программировании очень часто одно и то же можно делать несколькими способами.



Администратор

  • Administrator
  • Сообщения: 2,251
  • Записан

То есть второй способ отпадает. Остаётся первый с использованием «ActiveCell.FormulaArray» (вместо «ActiveCell» нужная ячейка).
Или вариант вообще без использования эксель-функций.



Администратор

  • Administrator
  • Сообщения: 2,251
  • Записан

Использование вашего первого способа. Вашу формулу оставил без изменений, только заключил в кавычки — в VBA формулу надо заключать в кавычки, а спереди нужно ставить знак равно:

Этот макрос вставляет формулу на активный лист в C3, а затем превращает формулу в значение, чтобы формулы не нагружали файл.

Sub макрос()

    With Range(«c3»)
        .FormulaArray = «=INDEX(Таблица1[Значение на начало часа],MATCH(R2C&RC1&RC2,Таблица1[Тег ]&Таблица1[Дата]&Таблица1[Час],0))»
        .Value = .Value
    End With

    End Sub

Кроме того. при работе с большим кол-вом формул или данных используйте формат «xlsb», он уменьшает размер файла и ускоряет работу формул. Формат xlsm нужен для взаимодействия с другими программами с помощью xml, а для всех остальных случаев не имеет смысла его использовать.


СПАСИБО!!!
А что значит — без использования эксель функций?



Администратор

  • Administrator
  • Сообщения: 2,251
  • Записан

Можно попробовать сделать макрос, в котором не будет эксель-функций. То есть сам VBA может сделать то же самое.



Администратор

  • Administrator
  • Сообщения: 2,251
  • Записан

Если вы что-то не поняли, то можете спросить.


  • Форум по VBA, Excel и Word

  • VBA, Excel

  • VBA, макросы в Excel

  • Excel VBA: Получение данных из «умной» таблицы с помощью макроса

I use this formula to copy unique records from Column A into Column B.

Range("A1", Range("A100").End(xlUp)).AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range("B1"), Unique:=True

Instead of copying it into Column B how do you put the filtered results into an array in Excel VBA?

asked Aug 16, 2012 at 21:33

MrPatterns's user avatar

2

It has been exactly a year since this question was asked but I ran into the same problem today and here is my solution for it:

Function copyFilteredData() As Variant
    Dim selectedData() As Variant
    Dim aCnt As Long
    Dim rCnt As Long

    Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Select
    On Error GoTo MakeArray:
    For aCnt = 1 To Selection.Areas.Count
        For rCnt = 1 To Selection.Areas(aCnt).Rows.Count
            ReDim Preserve SelectedData(UBound(selectedData) + 1)
            selectedData(UBound(selectedData)) = Selection.Areas(aCnt).Rows(rCnt)
        Next
    Next

    copyFilteredData = selectedData
    Exit Function

MakeArray:
    ReDim selectedData(1)
    Resume Next

End Function 

This will leave element 0 of the array empty but UBound(SelectedData) returns the number of rows in the selection

answered Aug 16, 2013 at 9:42

Johan G's user avatar

Johan GJohan G

3975 silver badges12 bronze badges

3

Just in case anyone ever looks at this again…
I created this function to work on a 1-D range but it will also write a higher dimension range to a 1-D array; it shouldn’t be too hard to modify to write a multiple dimension range to a «same shape» array. You need to have a reference to scrrun.dll to create the dictionary object. Scaling may be a problem since a «for each» loop is used but if you are using EXCEL this is likely nothing you are worried about:

Function RangeToArrUnique(rng As Range)
    Dim d As Object, cl As Range
    Set d = CreateObject("Scripting.Dictionary")
    For Each cl In rng
        d(cl.Value) = 1
    Next cl
    RangeToArrUnique = d.keys
End Function

I’ve tested this in this way:

Dim dat as worksheet
set dat = sheets("Data")
roomArr = Array("OR01","OR02","OR03")
dat.UsedRange.AutoFilter field:=2, criteria1:=roomArr, operator:=xlFilterValues
fltArr = RangeToArrUnique(dat.UsedRange.SpecialCells(CellTypeVisible))

Hope this helps someone out there!

answered Jan 20, 2016 at 15:26

mmurrietta's user avatar

Sub tester()

    Dim arr
    arr = UniquesFromRange(ActiveSheet.Range("A1:A5"))
    If UBound(arr) = -1 Then
        Debug.Print "no values found"
    Else
        Debug.Print "got array of unique values"
    End If

End Sub


Function UniquesFromRange(rng As Range)
    Dim d As Object, c As Range, tmp
    Set d = CreateObject("scripting.dictionary")
    For Each c In rng.Cells
       tmp = Trim(c.Value)
       If Len(tmp) > 0 Then
            If Not d.Exists(tmp) Then d.Add tmp, 1
       End If
    Next c
    UniquesFromRange = d.keys
End Function

answered Aug 16, 2012 at 22:15

Tim Williams's user avatar

Tim WilliamsTim Williams

150k8 gold badges96 silver badges124 bronze badges

You will want to Read this and it will point you in the right direction

It says:

  1. Use the AdvancedFilter method to create the filtered range in some unused area of a worksheet
  2. Assign the Value property of that range to a Variant to create a two-dimensional array
  3. Use the ClearContents method of that range to get rid of it

Dick Kusleika's user avatar

answered Aug 16, 2012 at 22:05

Sorceri's user avatar

SorceriSorceri

7,8101 gold badge28 silver badges38 bronze badges

3

A simple way to store a filtered range in an array is to use the copy-paste trick. Create a worksheet and make it hidden or very hidden. Say its code name is sht_calc. This function will give you a 2D array unless you only have one column and the filtered rows are only one, which in that case it will be a simple variant variable and not an array

Function GetArrayFromFilteredRange(rng As Range) As Variant
    Dim arr As Variant
    
    sht_calc.Cells.Clear
    rng.Copy sht_calc.Range("A1")
    arr = sht_calc.UsedRange.Value
    
    GetArrayFromFilteredRange = arr
End Function

For example if you want to get the array of filtered rows in a table called Table1 in a worksheet with a code name of sht1 you can simply do this:

dim rng as range
arr = GetArrayFromFilteredRange(sht1.ListObjects("Table1").DataBodyRange.SpecialCells(xlCellTypeVisible))

arr=GetArrayFromFilteredRange(rng)

answered Jul 1, 2020 at 13:52

Ibo's user avatar

IboIbo

3,9716 gold badges46 silver badges63 bronze badges

Here’s another way to do it. If there are no results it just does nothing.

Public Sub filteredRangeToArray(rg As Range, arr As Variant)

Dim i As Long
Dim j As Long
Dim row As Range
'If 0 results in Filter just exit
If Not rg.SpecialCells(xlCellTypeVisible).Count > 0 Then Exit Sub
i = 1
Erase arr
ReDim arr(1 To rg.Columns.Count, 1 To _
   rg.Columns(1).SpecialCells(xlCellTypeVisible).Count)
For Each row In rg.Rows
 If Not row.Hidden Then
  For j = LBound(arr, 1) To UBound(arr, 1)
  arr(j, i) = row.Cells(j)
  Next j
  i = i + 1
 End If
Next row
arr = WorksheetFunction.Transpose(arr)
End Sub

answered Apr 11, 2021 at 13:16

Charlio's user avatar

CharlioCharlio

3364 silver badges14 bronze badges

The following takes information from column A and gives a list. It assumes you have a «Sheet3» which is available for data input (you may wish to change this).

Sub test()

    Dim targetRng As Range
    Dim i As Integer

    Set targetRng = Sheets(3).Range("a1")
    Range("A1", Range("A999").End(xlUp)).AdvancedFilter Action:=xlFilterCopy, CopyToRange:=targetRng, Unique:=True

    Dim numbElements As Integer
    numbElements = targetRng.End(xlDown).Row
    Dim arr() As String

    ReDim arr(1 To numbElements) As String

    For i = 1 To numbElements
        arr(i) = targetRng.Offset(i - 1, 0).Value
    Next i

End Sub

answered Aug 16, 2012 at 21:58

enderland's user avatar

enderlandenderland

13.7k17 gold badges100 silver badges152 bronze badges

Содержание

  1. VBA Excel. Создание таблицы (умной, обычной)
  2. Создание и удаление умной таблицы
  3. Создание умной таблицы
  4. Стиль умной таблицы
  5. VBA Excel. Ячейки (обращение, запись, чтение, очистка)
  6. Обращение к ячейке по адресу
  7. Обращение к ячейке по индексу
  8. Обращение к ячейке по имени
  9. Запись информации в ячейку
  10. Vba excel умная таблица обращение к ячейке

VBA Excel. Создание таблицы (умной, обычной)

Создание таблицы с помощью кода VBA Excel. Создание умной и обычной пользовательской таблицы. Указание стиля умной таблицы, добавление строки итогов. Примеры.

Создание и удаление умной таблицы

Создание умной таблицы

Создается умная таблица Excel с помощью следующего кода:

В данном примере:

ActiveSheet — лист, на котором создается таблица, может быть любой лист рабочей книги Excel.

Range(«$A$1:$L$15») — диапазон, который преобразуется в таблицу. Можно использовать и такую форму: Range(Cells(1, 1), Cells(15, 12)), где индексы строк и столбцов можно заменить переменными.

xlNo — указывает, что первая строка выбранного диапазона не содержит заголовки столбцов (граф) будущей таблицы, и их необходимо добавить. В этом случае будет добавлена дополнительная строка с наименованиями столбцов по умолчанию: Столбец1, Столбец2, Столбец3 и т.д., которые в дальнейшем можно переименовать (количество строк в таблице, включая строку заголовков, получится на одну больше, чем в указанном диапазоне). Если в диапазоне уже содержатся заголовки столбцов будущей таблицы, то следует указать вместо xlNo значение xlYes. В этом случае первая строка указанного диапазона будет преобразована в строку заголовков, а если она будет не заполнена, то добавятся названия столбцов по умолчанию: Столбец1, Столбец2, Столбец3 и т.д. (количество строк в таблице, включая строку заголовков, будет то же, что и в указанном диапазоне).

МояТаблица1 — имя, присваиваемое создаваемой таблице. Имя должно быть без пробелов: при указании в коде VBA названия таблицы с пробелами, во время его выполнения Excel заменит пробелы знаками подчеркивания (по крайней мере, так происходит в Excel 2016).

Таблица будет создана со стилем по умолчанию (TableStyleMedium2 в Excel 2016).

Стиль умной таблицы

Присвоение стиля таблице (изменение стиля) осуществляется с помощью свойства TableStyle объекта ListObjects:

Источник

VBA Excel. Ячейки (обращение, запись, чтение, очистка)

Обращение к ячейке на листе Excel из кода VBA по адресу, индексу и имени. Чтение информации из ячейки. Очистка значения ячейки. Метод ClearContents объекта Range.

Обращение к ячейке по адресу

Допустим, у нас есть два открытых файла: «Книга1» и «Книга2», причем, файл «Книга1» активен и в нем находится исполняемый код VBA.

В общем случае при обращении к ячейке неактивной рабочей книги «Книга2» из кода файла «Книга1» прописывается полный путь:

Удобнее обращаться к ячейке через свойство рабочего листа Cells(номер строки, номер столбца), так как вместо номеров строк и столбцов можно использовать переменные. Обратите внимание, что при обращении к любой рабочей книге, она должна быть открыта, иначе произойдет ошибка. Закрытую книгу перед обращением к ней необходимо открыть.

Теперь предположим, что у нас в активной книге «Книга1» активны «Лист1» и ячейка на нем «A1». Тогда обращение к ячейке «A1» можно записать следующим образом:

Точно также можно обращаться и к другим ячейкам активного рабочего листа, кроме обращения ActiveCell, так как активной может быть только одна ячейка, в нашем примере – это ячейка «A1».

Если мы обращаемся к ячейке на неактивном листе активной рабочей книги, тогда необходимо указать этот лист:

Имя ярлыка может совпадать с основным именем листа. Увидеть эти имена можно в окне редактора VBA в проводнике проекта. Без скобок отображается основное имя листа, в скобках – имя ярлыка.

Обращение к ячейке по индексу

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

Например, индекс ячеек в первой строке равен номеру столбца. Индекс ячеек во второй строке равен количеству ячеек в первой строке (которое равно общему количеству столбцов на листе, зависящему от версии Excel) плюс номер столбца. Индекс ячеек в третьей строке равен количеству ячеек в двух первых строках плюс номер столбца. И так далее.

Для примера, Cells(4) та же ячейка, что и Cells(1, 4). Используется такое обозначение редко, тем более, что у разных версий Excel может быть разным количество столбцов и строк на рабочем листе.

По индексу можно обращаться к ячейке не только на всем рабочем листе, но и в отдельном диапазоне. Нумерация ячеек осуществляется в пределах заданного диапазона по тому же правилу: слева-направо и сверху-вниз. Вот индексы ячеек диапазона Range(«A1:C3»):

Обращение к ячейке Range(«A1:C3»).Cells(5) соответствует выражению Range(«B2») .

Обращение к ячейке по имени

Если ячейке на рабочем листе Excel присвоено имя (Формулы –> Присвоить имя), то обращаться к ней можно по присвоенному имени.

Допустим одной из ячеек присвоено имя – «Итого», тогда обратиться к ней можно – Range(«Итого») .

Запись информации в ячейку

Содержание ячейки определяется ее свойством «Value», которое в VBA Excel является свойством по умолчанию и его можно явно не указывать. Записывается информация в ячейку при помощи оператора присваивания «=»:

Источник

Vba excel умная таблица обращение к ячейке

Модератор форума: китин, _Boroda_

Мир MS Excel » Вопросы и решения » Вопросы по VBA » Отбор и перенос данных в умных таблицах (Макросы/Sub)

Отбор и перенос данных в умных таблицах

AVI Дата: Пятница, 24.08.2018, 13:57 | Сообщение № 1

Очередной затык.
Кодне выдает ошибок — это уже хорошо, но не работает.

Очередной затык.
Кодне выдает ошибок — это уже хорошо, но не работает.

Сообщение Очередной затык.
Кодне выдает ошибок — это уже хорошо, но не работает.

_Boroda_ Дата: Пятница, 24.08.2018, 14:06 | Сообщение № 2

Вам нужно заполнить вторую таблицу датами из первой?
Тогда

Но только такие вещи пробежкой массива по массиву не делаются — на более-менее больших диапазонах Excel сдохнет.
Вот примерно Ваш случай http://www.excelworld.ru/forum/10-38778-258819-16-1534706511

Вам нужно заполнить вторую таблицу датами из первой?
Тогда

Но только такие вещи пробежкой массива по массиву не делаются — на более-менее больших диапазонах Excel сдохнет.
Вот примерно Ваш случай http://www.excelworld.ru/forum/10-38778-258819-16-1534706511 _Boroda_

Скажи мне, кудесник, любимец ба’гов.
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995

Ответить

Сообщение Вам нужно заполнить вторую таблицу датами из первой?
Тогда

Но только такие вещи пробежкой массива по массиву не делаются — на более-менее больших диапазонах Excel сдохнет.
Вот примерно Ваш случай http://www.excelworld.ru/forum/10-38778-258819-16-1534706511 Автор — _Boroda_
Дата добавления — 24.08.2018 в 14:06

AVI Дата: Суббота, 25.08.2018, 05:24 | Сообщение № 3

Просто с массивами мне хотя бы понятно как это работает более-менее, а по ссылке — дремучий лес.

У меня будут не такие большие объемы в ближайший год, в течение года, может быть и разберусь, когда с функционалом закончу и дойдут руки до оптимизации работы.

Просто с массивами мне хотя бы понятно как это работает более-менее, а по ссылке — дремучий лес.

У меня будут не такие большие объемы в ближайший год, в течение года, может быть и разберусь, когда с функционалом закончу и дойдут руки до оптимизации работы. AVI

Сообщение _Boroda_, Спасибо!

Просто с массивами мне хотя бы понятно как это работает более-менее, а по ссылке — дремучий лес.

У меня будут не такие большие объемы в ближайший год, в течение года, может быть и разберусь, когда с функционалом закончу и дойдут руки до оптимизации работы. Автор — AVI
Дата добавления — 25.08.2018 в 05:24

AVI Дата: Вторник, 28.08.2018, 05:39 | Сообщение № 4
_Boroda_ Дата: Вторник, 28.08.2018, 09:12 | Сообщение № 5

Ответить

AVI Дата: Вторник, 28.08.2018, 09:56 | Сообщение № 6
boa Дата: Вторник, 28.08.2018, 10:51 | Сообщение № 7
_Boroda_ Дата: Вторник, 28.08.2018, 11:24 | Сообщение № 8

Ответить

AVI Дата: Четверг, 30.08.2018, 16:50 | Сообщение № 9
_Boroda_ Дата: Четверг, 30.08.2018, 18:27 | Сообщение № 10

думал, Вам интересно будет посмотреть. Извините, погорячился, был неправ

думал, Вам интересно будет посмотреть. Извините, погорячился, был неправ

Скажи мне, кудесник, любимец ба’гов.
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995

Ответить

думал, Вам интересно будет посмотреть. Извините, погорячился, был неправ

RAN Дата: Четверг, 30.08.2018, 20:36 | Сообщение № 11
Быть или не быть, вот в чем загвоздка!

Ответить

AVI Дата: Пятница, 31.08.2018, 05:31 | Сообщение № 12
_Boroda_ Дата: Пятница, 31.08.2018, 09:20 | Сообщение № 13

Да ладно, Алексей, это я больше в шутку.

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

И, кстати, задачи принципиально разные. В первой мы сравниваем значения из двух массивов (цикл в цикле или в словаре), а во второй проверка условия в одном массиве и вывод данных в другой. Поэтому конечно

Да ладно, Алексей, это я больше в шутку.

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

И, кстати, задачи принципиально разные. В первой мы сравниваем значения из двух массивов (цикл в цикле или в словаре), а во второй проверка условия в одном массиве и вывод данных в другой. Поэтому конечно

Скажи мне, кудесник, любимец ба’гов.
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995

Ответить

Сообщение Да ладно, Алексей, это я больше в шутку.

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

И, кстати, задачи принципиально разные. В первой мы сравниваем значения из двух массивов (цикл в цикле или в словаре), а во второй проверка условия в одном массиве и вывод данных в другой. Поэтому конечно

AVI Дата: Суббота, 01.09.2018, 10:18 | Сообщение № 14

_Boroda_,
А как заставить его переносить данные на нужный лист, а то он работает только на открытом листе.

И еще у меня Option Explicit о чем я ранее не сообщил.

Dim ar0, n0_, r0_, r1_, ar1, i, n1, n1_ As Long

ar0 = Range(«РасшГруппНакл_tb») ‘массив первой таблицы
n0_ = UBound(ar0) ‘кол-во строк в нем
r0_ = 13 ‘первая строка во второй таблице (без шапки)
r1_ = Cells(Rows.Count, 11).End(3).Row ‘ последняя строка второй табл
If r1_ >= r0_ Then ‘если табл 2 чем-то заполнена
Worksheets(«Отчет дневной стационар»).Cells(r0_, 11).Resize(r1_ — r0_ + 1, 1).Clear ‘очищаем
End If
ar1 = Worksheets(«Отчет дневной стационар»).Cells(r0_, 11).Resize(n0_, 2) ‘пустой массив с кол-вом строк, как в первой таблице
For i = 1 To n0_ ‘цикл по строкам первой табл
If ar0(i, 1) = «ДС» Then ‘если условие выполнено, то
n1_ = n1_ + 1 ‘счётчик увеличиваем на 1
ar1(n1_, 1) = ar0(i, 3) ‘заполняем ФИО второго массива
End If
Next i
Worksheets(«Отчет дневной стационар»).Cells(r0_, 11).Resize(n1_, 2) = ar1 ‘ выводим во вторую таблицу столько строк массива аr1, сколько нашли в цикле проверки

Сам разобрался — вроде работает

_Boroda_,
А как заставить его переносить данные на нужный лист, а то он работает только на открытом листе.

И еще у меня Option Explicit о чем я ранее не сообщил.

Dim ar0, n0_, r0_, r1_, ar1, i, n1, n1_ As Long

ar0 = Range(«РасшГруппНакл_tb») ‘массив первой таблицы
n0_ = UBound(ar0) ‘кол-во строк в нем
r0_ = 13 ‘первая строка во второй таблице (без шапки)
r1_ = Cells(Rows.Count, 11).End(3).Row ‘ последняя строка второй табл
If r1_ >= r0_ Then ‘если табл 2 чем-то заполнена
Worksheets(«Отчет дневной стационар»).Cells(r0_, 11).Resize(r1_ — r0_ + 1, 1).Clear ‘очищаем
End If
ar1 = Worksheets(«Отчет дневной стационар»).Cells(r0_, 11).Resize(n0_, 2) ‘пустой массив с кол-вом строк, как в первой таблице
For i = 1 To n0_ ‘цикл по строкам первой табл
If ar0(i, 1) = «ДС» Then ‘если условие выполнено, то
n1_ = n1_ + 1 ‘счётчик увеличиваем на 1
ar1(n1_, 1) = ar0(i, 3) ‘заполняем ФИО второго массива
End If
Next i
Worksheets(«Отчет дневной стационар»).Cells(r0_, 11).Resize(n1_, 2) = ar1 ‘ выводим во вторую таблицу столько строк массива аr1, сколько нашли в цикле проверки

Сам разобрался — вроде работает AVI

Сообщение _Boroda_,
А как заставить его переносить данные на нужный лист, а то он работает только на открытом листе.

И еще у меня Option Explicit о чем я ранее не сообщил.

Dim ar0, n0_, r0_, r1_, ar1, i, n1, n1_ As Long

ar0 = Range(«РасшГруппНакл_tb») ‘массив первой таблицы
n0_ = UBound(ar0) ‘кол-во строк в нем
r0_ = 13 ‘первая строка во второй таблице (без шапки)
r1_ = Cells(Rows.Count, 11).End(3).Row ‘ последняя строка второй табл
If r1_ >= r0_ Then ‘если табл 2 чем-то заполнена
Worksheets(«Отчет дневной стационар»).Cells(r0_, 11).Resize(r1_ — r0_ + 1, 1).Clear ‘очищаем
End If
ar1 = Worksheets(«Отчет дневной стационар»).Cells(r0_, 11).Resize(n0_, 2) ‘пустой массив с кол-вом строк, как в первой таблице
For i = 1 To n0_ ‘цикл по строкам первой табл
If ar0(i, 1) = «ДС» Then ‘если условие выполнено, то
n1_ = n1_ + 1 ‘счётчик увеличиваем на 1
ar1(n1_, 1) = ar0(i, 3) ‘заполняем ФИО второго массива
End If
Next i
Worksheets(«Отчет дневной стационар»).Cells(r0_, 11).Resize(n1_, 2) = ar1 ‘ выводим во вторую таблицу столько строк массива аr1, сколько нашли в цикле проверки

Сам разобрался — вроде работает Автор — AVI
Дата добавления — 01.09.2018 в 10:18

Источник

Adblock
detector

Понравилась статья? Поделить с друзьями:
  • Excel vba узнать номер строки ячейки
  • Excel vba узнать номер последней заполненной строки
  • Excel vba удалять строки если есть повторяющиеся
  • Excel vba удалить ячейку со сдвигом вверх
  • Excel vba удалить строку со сдвигом вверх