Vba excel таблица данных в массив

 

Molov

Пользователь

Сообщений: 18
Регистрация: 28.10.2013

#1

04.09.2017 20:40:50

Здравствуйте, в одном из последних моих вопросов был совет начать работать с массивами.
Вот уже на первом этапе возникла проблема — Как создать Массив, используя имя таблицы?

Информации как объявить массив много и вроде всё понятно, но там ничего не сказано можно ли создать массив по имени таблицы?
Здесь  

http://www.planetaexcel.ru/forum/index.php?PAGE_NAME=read&FID=8&TID=30500

«… Но взять в массив просто:  «

Код
Dim a  
a=[a1:b100] 

или

Код
a=[a1:b100].Value 

Далее был еще пример, попробовал разобрать

Код
Sub io()  
Dim v, x  'Объявление и инициализация массива Dim, Private, Public, ReDim, Static https://msdn.microsoft.com/RU-RU/library/office/gg251320.aspx
' но не указыван тип? https://msdn.microsoft.com/ru-ru/library/office/gg251750.aspx
With Sheets("СПБ") ' 'Оператор With используется для указания объекта, с которым мы будем работать. 
'Здесь Лист СПБ. Sheets это вроде коллекция?
v = .Range(.[A3], .Cells(.UsedRange.Rows.Count, "R")).Value ' массив таблицы  - там таблица от A до R 
'квадратные скобки А3 
'Свойства CurrentRegion и UsedRange  очень полезны, когда программа работает с диапазонами, размерами которых Вы не можете управлять.
' Мы не знали колличство строк поэтому вместо строк пишем .UsedRange.Rows.Count?  
'правда это была инфа из "MS Office. Руководство программиста по Visual Basic для MS Office 97" http://mf.grsu.by/UchProc/konspekt/VBA/ch02/ch04/ch03
ReDim x(1 To UBound(v), 1 To 18)   'Меняем размер массива?
End With  
End Sub

Но почему в этом примере не дают таблице имя и не создают массив по имени таблицы?

Здесь

https://msdn.microsoft.com/ru-ru/library/office/gg264844.aspx

«Функция Array» тоже имеет пример

Код
Dim A As Variant
A = Array(10,20,30)
B = A(2)

тоже не использовали ни разу имя таблицы

Читал про Оператор Dim

https://msdn.microsoft.com/ru-ru/library/office/gg251750.aspx

и то же  ничего для этой задачи не нашел

Возник вопрос. Вообще можно создавать массивы указывая не конкретные ячейки, а имя таблицы? По логике, если для ComboBox можно указать имя, значит и для массива должна быть возможность.

 

Sanja

Пользователь

Сообщений: 14838
Регистрация: 10.01.2013

#2

04.09.2017 20:47:24

Код
'массив значений ОБЛАСТИ ДАННЫХ 'умной' таблицы
arr = ActiveSheet.ListObjects("Таблица1").DataBodyRange.Value
'массив значений именованного диапазона
arr = Range("Таблица1").Value

Изменено: Sanja04.09.2017 20:48:34

Согласие есть продукт при полном непротивлении сторон.

 

Molov

Пользователь

Сообщений: 18
Регистрация: 28.10.2013

#3

05.09.2017 19:01:09

Взял на вооружение ‘массив значений ОБЛАСТИ ДАННЫХ ‘умной’ таблицы.
Написал так.

Код
Private Sub UserForm_Initialize()
Dim ArrSpisok() As Long
ArrSpisok = ActiveSheet.ListObjects("Список").DataBodyRange.Value ' имеется Таблица "Список"
UserForm1.ComboBox1.Value = ArrSpisok
End Sub

Всё верно, таблица у меня ‘умная’

http://www.planetaexcel.ru/techniques/2/136/

UserForm1.ComboBox1.List= ArrSpisok то же пробовал

Пишет Run-time error ’13’: Type mismatch

Прикрепленные файлы

  • ComboBox Массив.xlsm (43.25 КБ)

 

RAN

Пользователь

Сообщений: 7091
Регистрация: 21.12.2012

#4

05.09.2017 19:05:13

И очень просто…

Код
UserForm1.ComboBox1.Value

Это 1 элемент массива, а не весь массив.

PS

Код
Private Sub UserForm_Initialize()
    Dim ArrSpisok
    ArrSpisok = ActiveSheet.ListObjects("Список").DataBodyRange.Value ' имеется Таблица "Список"
    UserForm1.ComboBox1.List = ArrSpisok
End Sub

Изменено: RAN05.09.2017 19:28:39

 

Sanja

Пользователь

Сообщений: 14838
Регистрация: 10.01.2013

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

Согласие есть продукт при полном непротивлении сторон.

 

Sanja

Пользователь

Сообщений: 14838
Регистрация: 10.01.2013

#6

05.09.2017 19:28:37

И ArrSpisok() не

может быть

Long

Код
Private Sub UserForm_Initialize()
    Dim ArrSpisok
    ArrSpisok = WorkSheets("Люди").ListObjects("Список").DataBodyRange.Value ' имеется Таблица "Список"
    UserForm1.ComboBox1.List = ArrSpisok
End Sub

Изменено: Sanja05.09.2017 20:18:29

Согласие есть продукт при полном непротивлении сторон.

 

Molov

Пользователь

Сообщений: 18
Регистрация: 28.10.2013

Спасибо, всё шикарно подошло. Long указал, так как в других примерах его использовали когда ожидалось много строк.
Ну и путаница. Кое что смотрю из «Приемов» у вас, кое что на др сайтах/форумах, а по формам вообще на ютубе смотрел.

Имеется ли рекомендуемая литература, чтобы банально не путаться с синтаксисом? Может более целенаправленное и системное изучение поможет.

 

Sanja

Пользователь

Сообщений: 14838
Регистрация: 10.01.2013

Поищите в Курилке, несколько тем было про ‘рекомендуемую литературу’

Согласие есть продукт при полном непротивлении сторон.

 

RAN

Пользователь

Сообщений: 7091
Регистрация: 21.12.2012

#9

05.09.2017 20:17:08

Цитата
Molov написал:
Long указал, так как в других примерах его использовали когда ожидалось много строк

Быть такого не может. Long — это тип данных в массиве. И с количеством строк никак не связан. Но значения типа String (строка), при загрузке в него дадут ошибку.

Копирование значений из диапазона ячеек в массив и обратно с помощью 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


Using the shape of the Range

Another approach in creating a function for ArrayFromRange would be using the shape and size of the Range to determine how we should structure the array. This way we don’t have to load the data into an intermediate array to determine the dimension.

For instance, if the target range is only one cell, then we know we want to return an array with the single value in it Array(target.value).

Below is the complete function that should deal with all cases. Note, this uses the same technique of using the Application.Transpose method to reshape the array.

' Helper function that returns an array from a range with the
' correct dimensions. This fixes the issue of single values
' not returning as an array, and when a 2 dimension array is returned
' when it only has 1 dimension of data.
'
' @author Robert Todar <robert@roberttodar.com>
Public Function ArrayFromRange(ByVal target As Range) As Variant
    Select Case True
        ' Single cell
        Case target.Cells.Count = 1
            ArrayFromRange = Array(target.Value)
            
        ' Single Row
        Case target.Rows.Count = 1
            ArrayFromRange = Application.Transpose( _
                Application.Transpose(target.Value) _
            )
        
        ' Single Column
        Case target.Columns.Count = 1
            ArrayFromRange = Application.Transpose(target.Value)
            
        ' Multi dimension array
        Case Else
            ArrayFromRange = target.Value
    End Select
End Function

Testing the ArrayFromRange function

As a bonus, here are the tests that I ran to check that this function works.

' @requires {function} ArrayDimensionLength
' @requires {function} ArrayCount
Private Sub testArrayFromRange()
    ' Setup a new workbook/worksheet for
    ' adding testing data
    Dim testWorkbook As Workbook
    Set testWorkbook = Workbooks.Add
    Dim ws As Worksheet
    Set ws = testWorkbook.Worksheets(1)
    
    ' Add sample data for testing.
    ws.Range("A1:A2") = Application.Transpose(Array("A1", "A2"))
    ws.Range("B1:B2") = Application.Transpose(Array("B1", "B2"))
    
    ' This section will run all the tests.
    Dim x As Variant
    
    ' Single cell
    x = ArrayFromRange(ws.Range("A1"))
    Debug.Assert ArrayDimensionLength(x) = 1
    Debug.Assert ArrayCount(x) = 1
    
    ' Single Row
    x = ArrayFromRange(ws.Range("A1:B1"))
    Debug.Assert ArrayDimensionLength(x) = 1
    Debug.Assert ArrayCount(x) = 2
    
    ' Single Column
    x = ArrayFromRange(ws.Range("A1:A2"))
    Debug.Assert ArrayDimensionLength(x) = 1
    Debug.Assert ArrayCount(x) = 2
    
    ' Multi Column
    x = ArrayFromRange(ws.Range("A1:B2"))
    Debug.Assert ArrayDimensionLength(x) = 2
    Debug.Assert ArrayCount(x) = 4
    
    ' Cleanup testing environment
    testWorkbook.Close False
    
    ' Print result
    Debug.Print "testArrayFromRange: PASS"
End Sub

Helper functions for the tests

In my tests I used two helper functions: ArrayCount, and ArrayDimensionLength. These are listed below for reference.

' Returns the length of the dimension of an array
'
' @author Robert Todar <robert@roberttodar.com>
Public Function ArrayDimensionLength(sourceArray As Variant) As Integer
On Error GoTo catch
    Do
        Dim currentDimension As Long
        currentDimension = currentDimension + 1
        
        ' `test` is used to see when the
        ' Ubound throws an error. It is unused
        ' on purpose.
        Dim test As Long
        test = UBound(sourceArray, currentDimension)
    Loop
catch:
    ' Need to subtract one because the last
    ' one errored out.
    ArrayDimensionLength = currentDimension - 1
End Function
' Get count of elements in an array regardless of
' the option base. This Looks purely at the size
' of the array, not the contents within them such as
' empty elements.
'
' @author Robert Todar <robert@roberttodar.com>
' @requires {function} ArrayDimensionLength
Public Function ArrayCount(ByVal sourceArray As Variant) As Long
    Dim dimensions As Long
    dimensions = ArrayDimensionLength(sourceArray)
    
    Select Case dimensions
        Case 0
            ArrayCount = 0
        
        Case 1
            ArrayCount = (UBound(sourceArray, 1) - LBound(sourceArray, 1)) + 1
        
        Case Else
            ' Need to set arrayCount to 1 otherwise the
            ' loop will keep multiplying by zero for each
            ' iteration
            ArrayCount = 1
           
            Dim dimension As Long
            For dimension = 1 To dimensions
                ArrayCount = ArrayCount * _
                    ((UBound(sourceArray, dimension) - LBound(sourceArray, dimension)) + 1)
            Next
    End Select
End Function

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

Return to VBA Code Examples

In this Article

  • Assign Range to Array
    • Assign Value From a Single Column
    • Assign value from multiple columns

This tutorial will demonstrate how to populate an array with a range of cells.

Assign Range to Array

We can easily populate a Variant array with a range of cells.

Assign Value From a Single Column

This example will loop through Range(“A1:A10”), assigning the the cell values to an array:

Sub TestArrayValuesSingle()
'Declare the array as a variant array
   Dim arRng() As Variant

'Declare the integer to store the number of rows
   Dim iRw As Integer

'Assign range to a the array variable
   arRng = Range("A1:A10")

'loop through the rows - 1 to 10
   For iRw = 1 To UBound(arRng)

'show the result in the immediate window
      Debug.Print arRng(iRw , 1)
   Next iRw 
End Sub

The UBound is used to set the array upper bound (eg 10) so that the loop knows to loop 10 times.

The Debug.Print function will show you the value contained in the array in the immediate window.

Assign value from multiple columns

Sub TestArrayValuesMultiple()
'Declare the array as a variant array
   Dim arRng() As Variant 

'Declare the integer to store the number of rows
   Dim iRw As Integer

'Declare the integer to store the number of columns
   Dim iCol as Integer

'Assign range to a the array variable
   arRng = Range("A1:C10")

'loop through the rows - 1 to 10
   For iRw = 1 To UBound(arRng,1)

'now - while in row 1, loop through the 3 columns
      For iCol = 1 to UBound(arRng,2)

'show the result in the immediate window
         Debug.Print arRng(iRw, iCol)
      Next iCol
   Next iRw 
End Sub

In the code above, we have populated the array with the values in Range(“A1:C10”).

The UBound is once again used – but this time it is needed twice – once to loop through the rows, and then again to loop through the columns.

The Debug.Print function will show you the value contained in the array in the immediate window.

VBA Coding Made Easy

Stop searching for VBA code online. Learn more about AutoMacro — A VBA Code Builder that allows beginners to code procedures from scratch with minimal coding knowledge and with many time-saving features for all users!
vba save as

Learn More!

Like this post? Please share to your friends:
  • Vba excel считать значения с ячеек
  • Vba excel счетчик цикла
  • Vba excel счетчик строк
  • Vba excel сцепить ячейки в excel
  • Vba excel суммирование диапазона ячеек