Копировать массив vba excel

Example

You can copy a VBA array into an array of the same type using the = operator. The arrays must be of the same type otherwise the code will throw a «Can’t assign to array» compilation error.

Dim source(0 to 2) As Long
Dim destinationLong() As Long
Dim destinationDouble() As Double

destinationLong = source     ' copies contents of source into destinationLong
destinationDouble = source   ' does not compile

The source array can be fixed or dynamic, but the destination array must be dynamic. Trying to copy to a fixed array will throw a «Can’t assign to array» compilation error. Any preexisting data in the receiving array is lost and its bounds and dimenions are changed to the same as the source array.

Dim source() As Long
ReDim source(0 To 2)

Dim fixed(0 To 2) As Long
Dim dynamic() As Long

fixed = source   ' does not compile
dynamic = source ' does compile

Dim dynamic2() As Long
ReDim dynamic2(0 to 6, 3 to 99) 

dynamic2 = source ' dynamic2 now has dimension (0 to 2)

Once the copy is made the two arrays are seperate in memory, i.e. the two variables are not references to same underlying data, so changes made to one array do not appear in the other.

Dim source(0 To 2) As Long
Dim destination() As Long

source(0) = 3
source(1) = 1
source(2) = 4

destination = source
destination(0) = 2

Debug.Print source(0); source(1); source(2)                ' outputs: 3 1 4
Debug.Print destination(0); destination(1); destination(2) ' outputs: 2 1 4

Copying Arrays of Objects

With arrays of objects the references to those objects are copied, not the objects themselves. If a change is made to an object in one array it will also appear to be changed in the other array — they are both referencing the same object. However, setting an element to a different object in one array won’t set it to that object the other array.

Dim source(0 To 2) As Range
Dim destination() As Range

Set source(0) = Range("A1"): source(0).Value = 3
Set source(1) = Range("A2"): source(1).Value = 1
Set source(2) = Range("A3"): source(2).Value = 4

destination = source

Set destination(0) = Range("A4")   'reference changed in destination but not source

destination(0).Value = 2           'affects an object only in destination
destination(1).Value = 5           'affects an object in both source and destination

Debug.Print source(0); source(1); source(2)                  ' outputs 3 5 4
Debug.Print destination(0); destination(1); destination(2)   ' outputs 2 5 4

Variants Containing an Array

You can also copy an array into and from a variant variable. When copying from a variant, it must contain an array of the same type as the receiving array otherwise it will throw a «Type mismatch» runtime error.

Dim var As Variant
Dim source(0 To 2) As Range
Dim destination() As Range

var = source
destination = var

var = 5
destination = var  ' throws runtime error

Копирование массивов

Вы можете скопировать массив VBA в массив того же типа, используя оператор = . Массивы должны быть одного типа, иначе код будет генерировать ошибку компиляции «Can not assign to array».

Dim source(0 to 2) As Long
Dim destinationLong() As Long
Dim destinationDouble() As Double

destinationLong = source     ' copies contents of source into destinationLong
destinationDouble = source   ' does not compile

Исходный массив может быть фиксированным или динамическим, но целевой массив должен быть динамическим. Попытка скопировать в фиксированный массив вызовет ошибку компиляции «Can not assign to array». Любые существующие данные в принимающем массиве теряются, а его границы и размеры изменяются так же, как исходный массив.

Dim source() As Long
ReDim source(0 To 2)

Dim fixed(0 To 2) As Long
Dim dynamic() As Long

fixed = source   ' does not compile
dynamic = source ' does compile

Dim dynamic2() As Long
ReDim dynamic2(0 to 6, 3 to 99) 

dynamic2 = source ' dynamic2 now has dimension (0 to 2)

Как только копия сделана, два массива являются отдельными в памяти, то есть две переменные не являются ссылками на одни и те же базовые данные, поэтому изменения, внесенные в один массив, не отображаются в другом.

Dim source(0 To 2) As Long
Dim destination() As Long

source(0) = 3
source(1) = 1
source(2) = 4

destination = source
destination(0) = 2

Debug.Print source(0); source(1); source(2)                ' outputs: 3 1 4
Debug.Print destination(0); destination(1); destination(2) ' outputs: 2 1 4

Копирование массивов объектов

С массивами объектов копируются ссылки на эти объекты, а не сами объекты. Если изменение в объекте в одном массиве будет также изменено в другом массиве — они оба ссылаются на один и тот же объект. Однако установка элемента в другой объект в одном массиве не приведет его к этому объекту в другом массиве.

Dim source(0 To 2) As Range
Dim destination() As Range

Set source(0) = Range("A1"): source(0).Value = 3
Set source(1) = Range("A2"): source(1).Value = 1
Set source(2) = Range("A3"): source(2).Value = 4

destination = source

Set destination(0) = Range("A4")   'reference changed in destination but not source

destination(0).Value = 2           'affects an object only in destination
destination(1).Value = 5           'affects an object in both source and destination

Debug.Print source(0); source(1); source(2)                  ' outputs 3 5 4
Debug.Print destination(0); destination(1); destination(2)   ' outputs 2 5 4

Варианты, содержащие массив

Вы также можете скопировать массив в переменную варианта и из нее. При копировании из варианта он должен содержать массив того же типа, что и принимающий массив, иначе он будет вызывать ошибку «Ошибка несоответствия типа».

Dim var As Variant
Dim source(0 To 2) As Range
Dim destination() As Range

var = source
destination = var

var = 5
destination = var  ' throws runtime error

Возвращаемые массивы из функций

Функция в нормальном модуле (но не модуле класса) может возвращать массив, помещая () после типа данных.

Function arrayOfPiDigits() As Long()
    Dim outputArray(0 To 2) As Long
    
    outputArray(0) = 3
    outputArray(1) = 1
    outputArray(2) = 4

    arrayOfPiDigits = outputArray
End Function

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

Sub arrayExample()

    Dim destination() As Long
    Dim var As Variant
    
    destination = arrayOfPiDigits()
    var = arrayOfPiDigits
    
    Debug.Print destination(0)          ' outputs 3
    Debug.Print var(1)                  ' outputs 1
    Debug.Print arrayOfPiDigits()(2)    ' outputs 4
    
End Sub

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

Вывод массива через выходной аргумент

Обычно это хорошая практика кодирования для аргументов процедуры как входных данных и для вывода через возвращаемое значение. Однако ограничения VBA иногда требуют, чтобы процедура выводила данные через аргумент ByRef .

Вывод в фиксированный массив

Sub threePiDigits(ByRef destination() As Long)
    destination(0) = 3
    destination(1) = 1
    destination(2) = 4
End Sub

Sub printPiDigits()
    Dim digits(0 To 2) As Long
    
    threePiDigits digits
    Debug.Print digits(0); digits(1); digits(2) ' outputs 3 1 4
End Sub

Вывод массива из метода класса

Выходной аргумент также может использоваться для вывода массива из метода / процедуры в модуле класса

' Class Module 'MathConstants'
Sub threePiDigits(ByRef destination() As Long)
    ReDim destination(0 To 2)
    
    destination(0) = 3
    destination(1) = 1
    destination(2) = 4
End Sub

' Standard Code Module
Sub printPiDigits()
    Dim digits() As Long
    Dim mathConsts As New MathConstants
    
    mathConsts.threePiDigits digits
    Debug.Print digits(0); digits(1); digits(2) ' outputs 3 1 4
End Sub

Передача массивов на прохождение

Массивы могут передаваться в процедуры, помещая () после имени переменной массива.

Function countElements(ByRef arr() As Double) As Long
    countElements = UBound(arr) - LBound(arr) + 1
End Function

Массивы должны передаваться по ссылке. Если не указан какой-либо передающий механизм, например myFunction(arr()) , то VBA будет считать ByRef по умолчанию, однако хорошая практика кодирования делает его явным. Попытка передать массив по значению, например myFunction(ByVal arr()) приведет к ошибке компиляции «Array argument должно быть ByRef» (или ошибке компиляции «Синтаксическая ошибка», если Auto Syntax Check не проверена в параметрах VBE) ,

Передача по ссылке означает, что любые изменения в массиве будут сохранены в процессе вызова.

Sub testArrayPassing()
    Dim source(0 To 1) As Long
    source(0) = 3
    source(1) = 1
    
    Debug.Print doubleAndSum(source)  ' outputs 8
    Debug.Print source(0); source(1)  ' outputs 6 2
End Sub

Function doubleAndSum(ByRef arr() As Long)
    arr(0) = arr(0) * 2
    arr(1) = arr(1) * 2
    doubleAndSum = arr(0) + arr(1)
End Function

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

Function doubleAndSum(ByRef arr() As Long)
    doubleAndSum = arr(0) * 2 + arr(1) * 2
End Function

Альтернативно создайте рабочую копию массива и работайте с копией.

Function doubleAndSum(ByRef arr() As Long)
    Dim copyOfArr() As Long
    copyOfArr = arr
    
    copyOfArr(0) = copyOfArr(0) * 2
    copyOfArr(1) = copyOfArr(1) * 2
    
    doubleAndSum = copyOfArr(0) + copyOfArr(1)
End Function

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


  • Remove From My Forums
  • Question

  • Hi friends,

    I am trying to write a copy paste array.

    I get an error object worksheet not found

    Here is my code

     

     Sub Copy_Paste_Array()
        
       
        Dim i           As Long
        Dim ows         As Excel.Worksheet
        Dim oSWksht     As Excel.Worksheet
        Dim oDWksht     As Excel.Worksheet
    
    
       oSWksht = ActiveWorkbook.Worksheets("AA")
       
       oDWksht = ActiveWorkbook.Worksheets("BB")
    
       oCopyRange = Array("A1", "A2")
        
       oDestinationRange = Array("A1", "A2")
        
        
        For i = LBound(oCopyRange) To UBound(oCopyRange)
        
        oSWksht.Range(oCopyRange(i)).Copy Destination:=oDWksht.Range(oDestinationRange(i).Value)
        
        Next i
    
    
      End Sub

    Please may some one look at it

    Thank you for your time


    Cheers Dan :)

Answers

  • Since worksheets are objects, you have to use the keyword Set to assign a value to a variable of type Worksheet:

       Set oSWksht = ActiveWorkbook.Worksheets(«AA»)

      
       Set oDWksht

    = ActiveWorkbook.Worksheets(«BB»)


    Regards, Hans Vogelaar (http://www.eileenslounge.com)

    • Marked as answer by

      Tuesday, November 7, 2017 10:25 PM

  • Sorry about that, it should have been

            oSWksht.Range(oCopyRange(i)).Copy Destination:=oDWksht.Range(oDestinationRange(i))


    Regards, Hans Vogelaar (http://www.eileenslounge.com)

    • Marked as answer by
      Dan_CS
      Tuesday, November 7, 2017 10:25 PM

# Copying Arrays

You can copy a VBA array into an array of the same type using the = operator. The arrays must be of the same type otherwise the code will throw a «Can’t assign to array» compilation error.

The source array can be fixed or dynamic, but the destination array must be dynamic. Trying to copy to a fixed array will throw a «Can’t assign to array» compilation error. Any preexisting data in the receiving array is lost and its bounds and dimenions are changed to the same as the source array.

Once the copy is made the two arrays are seperate in memory, i.e. the two variables are not references to same underlying data, so changes made to one array do not appear in the other.

# Copying Arrays of Objects

With arrays of objects the references to those objects are copied, not the objects themselves. If a change is made to an object in one array it will also appear to be changed in the other array — they are both referencing the same object. However, setting an element to a different object in one array won’t set it to that object the other array.

# Variants Containing an Array

You can also copy an array into and from a variant variable. When copying from a variant, it must contain an array of the same type as the receiving array otherwise it will throw a «Type mismatch» runtime error.

# Returning Arrays from Functions

A function in a normal module (but not a Class module) can return an array by putting () after the data type.

The result of the function can then be put into a dynamic array of the same type or a variant. The elements can also be accessed directly by using a second set of brackets, however this will call the function each time, so its best to store the results in a new array if you plan to use them more than once

Note that what is returned is actually a copy of the array inside the function, not a reference. So if the function returns the contents of a Static array its data can’t be changed by the calling procedure.

# Outputting an Array via an output argument

It is normally good coding practice for a procedure’s arguments to be inputs and to output via the return value. However, the limitations of VBA sometimes make it necessary for a procedure to output data via a ByRef argument.

# Outputting to a fixed array

# Outputting an Array from a Class method

An output argument can also be used to output an array from a method/proceedure in a Class module

# Passing Arrays to Proceedures

Arrays can be passed to proceedures by putting () after the name of the array variable.

Arrays must be passed by reference. If no passing mechanism is specified, e.g. myFunction(arr()), then VBA will assume ByRef by default, however it is good coding practice to make it explicit. Trying to pass an array by value, e.g. myFunction(ByVal arr()) will result in an «Array argument must be ByRef» compilation error (or a «Syntax error» compilation error if Auto Syntax Check is not checked in the VBE options).

Passing by reference means that any changes to the array will be preserved in the calling proceedure.

If you want to avoid changing the original array then be careful to write the function so that it doesn’t change any elements.

Alternatively create a working copy of the array and work with the copy.

 

Игорь Нигматулин

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

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

#1

13.05.2021 20:16:22

Здравствуйте. Хотелось бы заранее отметить, что владею слабым уровнем знаний VBA. Не судите строго, за плохой код. Необходимо написать программу для копирования ячеек из 1 документа в другой. Копирование будет происходить в зависимости от месяца.При январе, в ячейке QA1 будет стоять число 1 , в результате  данные будут копироваться в определённые ячейки. Ячейки, с документа  которого планируем копировать, не изменяют своего положения каждый месяц. Решил сделать это с помощью двумерного массива.
Возникла ошибка «object doesn’t support this property or method » в строке кода:

Код
For Each CopyRange In sheetS("xmao").Range("AE119:AE161")А так же Sub or function not defined

А так же «sub of function not defined» в строке кода:

Код
СopyRange(70, 10).Value = Workbooks("Start").Range(158, 27 + i).Select

Так же затрудняюсь как скопировать отдельные ячейки из двумерного массива в другой документ. Решил проблему подобным планом, до неё из-за ошибок пока не дошёл. Интересно ваше мнение, правильно ли написал и сработает ли код.
Заранее спасибо за получению инфорацию.

Код
Sub Macros()
Dim filetoopen4 As Variant, file3 As Workbook, sheetS  As Worksheet, a As Variant, file4 As Workbook, Index As Long, i As Long
    Set file3 = Workbooks("Start")
    Set sheetS = Workbooks("Start").Worksheets("List")
    Workbooks("Start").Worksheets("List").Activate
    a = Workbooks("Start").Worksheets("List").Cells(1, 24)
    filetoopen4 = Application.GetOpenFilename(Title:="Отчёт")
        If filetoopen4 <> False Then
    Set file4 = Workbooks.Open(filetoopen4)
          If Index = i Then
            Dim DimArr(1 To 91, 1 To 39) As Double
            Dim CopyRange As Range
                For Each CopyRange In sheetS("xmao").Range("AE119:AE161")
                DimArr(CopyRange.Row, CopyRange.Column) = CopyRange
                    CopyRange(21, 3).Value = Workbooks("Start").Range(119, 27 + i).Select
                    CopyRange(28, 3).Value = Workbooks("Start").Range(120, 27 + i).Select
                    CopyRange(31, 3).Value = Workbooks("Start").Range(121, 27 + i).Select
                    CopyRange(21, 1).Value = Workbooks("Start").Range(129.27 + i).Select
                    CopyRange(28, 1).Value = Workbooks("Start").Range(130.27 + i).Select
                    CopyRange(31, 1).Value = Workbooks("Start").Range(131, 27 + i).Select
                    CopyRange(70, 2).Value = Workbooks("Start").Range(134, 27 + i).Select
                    CopyRange(77, 2).Value = Workbooks("Start").Range(135, 27 + i).Select
                    CopyRange(80, 2).Value = Workbooks("Start").Range(136, 27 + i).Select
                    CopyRange(21, 6).Value = Workbooks("Start").Range(140, 27 + i).Select
                    CopyRange(28, 6).Value = Workbooks("Start").Range(141, 27 + i).Select
                    CopyRange(31, 6).Value = Workbooks("Start").Range(142, 27 + i).Select
                    CopyRange(70, 11).Value = Workbooks("Start").Range(146, 27 + i).Select
                    CopyRange(77, 11).Value = Workbooks("Start").Range(147, 27 + i).Select
                    CopyRange(80, 11).Value = Workbooks("Start").Range(148, 27 + i).Select
                    СopyRange(70, 10).Value = Workbooks("Start").Range(158, 27 + i).Select
                    CopyRange(77, 10).Value = Workbooks("Start").Range(159, 27 + i).Select
                    CopyRange(80, 10).Value = Workbooks("Start").Range(160, 27 + i).Select
                    Next CopyRange
                    End If
        file3.Close (False)
        End If
End Sub

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

  • Start.xlsm (18.93 КБ)

 

Mershik

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

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

#2

13.05.2021 20:21:03

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

Код
 For Each CopyRange In sheetS("xmao").Range("AE119:AE161")

нужно указывать книгу

Код
 For Each CopyRange In ActiveWorkbook.sheetS("xmao").Range("AE119:AE161")

а вот эта часть и ниже вообще не понятно что это  для чего

Код
DimArr(CopyRange.Row, CopyRange.Column) = CopyRange
CopyRange(21, 3).Value = Workbooks("Start").Range(119, 27 + i).Select

Изменено: Mershik13.05.2021 20:36:46

Не бойтесь совершенства. Вам его не достичь.

 

В документ «Start» мы копируем данные с документа «Файл с которого копируем».
Задумка программы следующая. Человек вбивает число от 1  до 12 (число месяцев в году, вбиваем в ячейку AQ1 ) и при активации программы, всплывает окно с просьбой выбрать  необходимый документ, с которого будем копировать данные.  В данном документе я с помощью двумерного массива хотел выделить необходимые ячейки с данными и скопировать их в документ «Start».
Таблица в которую необходимо копировать находиться в диапазоне ячеек AC117: AO155. Документ Start
Ячейки которые необходимо копировать находятся : A 21,28,21. C 21.28,31. F 21,28,31. B 70,77,80. J70,77,80.K 70,77,80. Документ Start «Файл с которого копируем»

Изменено: Игорь Нигматулин13.05.2021 20:42:50

 

Mershik

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

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

#4

13.05.2021 20:40:32

Цитата
Игорь Нигматулин написал:
Человек вбивает число от 1  до 12

куда вбивается? где это в макросе ?

Цитата
В данном документе я с помощью двумерного массива хотел выделить необходимые ячейки с данными и скопировать их в документ «Start».  

массив это не диапазон…

Изменено: Mershik13.05.2021 20:41:23

Не бойтесь совершенства. Вам его не достичь.

 

New

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

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

#5

13.05.2021 20:43:13

Цитата
Игорь Нигматулин написал:
For Each CopyRange In sheetS(«xmao»).Range(«AE119:AE161»)

а где лист XMAO ?

Изменено: New13.05.2021 20:43:20

 

Игорь Нигматулин

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

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

#6

13.05.2021 20:44:02

XMAO  — это Лист 1 в документе с которого копируем. Сам документ на работе, это лишь макет

Цитата
Человек вбивает число от 1  до 12 куда вбивается? где это в макросе ?

Вбивает число вручную, после чего запускает макрос

Цитата
Mershik написал: а вот эта часть и ниже вообще не понятно что это  для чего

Попытка скопировать данные с ячеек с помощью двумерного массива . Но это неправильно, как мне кажется, Можете подсказать, как именно это сделать  

 

_Igor_61

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

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

#7

13.05.2021 21:04:21

Цитата
Игорь Нигматулин написал: Таблица в которую необходимо копировать находиться в диапазоне ячеек AC117: AO155. Документ Start

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

Цитата
New написал:где лист XMAO ?
Цитата
Mershik написал: куда вбивается?
Цитата
Игорь Нигматулин написал: Задумка программы следующая. Человек вбивает число от 1  до 12

Если нужно именно это, то вставьте в начало макроса перед «Set»:

Код
Dim vstavit
vstavit=InputBox("Введите значение")

И потом опишите что именно не получается :)

 

Mershik

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

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

#8

13.05.2021 21:28:33

Игорь Нигматулин, ничего не понятно…но вдруг

Код
Option Explicit
Sub Macros()
Dim filetoopen4 As Variant, file3 As Workbook, sheetS  As Worksheet, a As Variant, file4 As Workbook, Index As Long, i As Long
i = InputBox("Введите значение от 1 до 12")
    Set file3 = Workbooks("Start")
    Set sheetS = Workbooks("Start").Worksheets("List")
    Workbooks("Start").Worksheets("List").Activate
    a = sheetS.Cells(1, 24)
    filetoopen4 = Application.GetOpenFilename(Title:="Отчёт")
    If filetoopen4 <> False Then
        Set file4 = Workbooks.Open(filetoopen4)
    Dim wb As Workbook, sh As Worksheet: Set wb = ActiveWorkbook: Set sh = wb.Worksheets("xmao")
            With sheetS
                .Cells(119, 28 + i) = sh.Cells(21, 3)
                .Cells(120, 28 + i) = sh.Cells(28, 3)
                .Cells(121, 28 + i) = sh.Cells(31, 3)
                ' и так далее
            End With
    End If
    wb.Close (False)
End Sub

Изменено: Mershik13.05.2021 21:30:35

Не бойтесь совершенства. Вам его не достичь.

 

Игорь Нигматулин

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

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

#9

14.05.2021 18:41:29

Большое спасибо за код, процесс проходит без ошибок, но не происходит самого процесса копирования из  sh.Cells(21, 3)  в Cells(119, 28 + i).
Ребят, подскажите, как совершить копирование.
Спасибо!

Код
Sub Macros()
Dim filetoopen4 As Variant, file3 As Workbook, sheetS  As Worksheet, a As Variant, file4 As Workbook, Index As Long, i As Long
i = InputBox("??????? ???????? ?? 1 ?? 12")
    Set file3 = Workbooks("Start")
    Set sheetS = Workbooks("Start").Worksheets("List")
    Workbooks("Start").Worksheets("List").Activate
    a = sheetS.Cells(1, 24)
    filetoopen4 = Application.GetOpenFilename(Title:="?????")
    If filetoopen4 <> False Then
        Set file4 = Workbooks.Open(filetoopen4)
    Dim wb As Workbook, sh As Worksheet: Set wb = ActiveWorkbook: Set sh = wb.Worksheets("xmao")
            With sheetS
                .Cells(119, 28 + i) = sh.Cells(21, 3)
                .Cells(120, 28 + i) = sh.Cells(28, 3)
                .Cells(121, 28 + i) = sh.Cells(31, 3)
                .Cells(119, 28 + i) = sh.Cells(21, 1)
                .Cells(120, 28 + i) = sh.Cells(28, 1)
                .Cells(121, 28 + i) = sh.Cells(31, 1)
                .Cells(119, 28 + i) = sh.Cells(70, 2)
                .Cells(120, 28 + i) = sh.Cells(78, 2)
                .Cells(121, 28 + i) = sh.Cells(80, 2)
                .Cells(119, 28 + i) = sh.Cells(21, 6)
                .Cells(120, 28 + i) = sh.Cells(28, 6)
                .Cells(121, 28 + i) = sh.Cells(31, 6)
                .Cells(119, 28 + i) = sh.Cells(70, 11)
                .Cells(120, 28 + i) = sh.Cells(78, 11)
                .Cells(121, 28 + i) = sh.Cells(80, 11)
                .Cells(119, 28 + i) = sh.Cells(70, 10)
                .Cells(120, 28 + i) = sh.Cells(78, 10)
                .Cells(121, 28 + i) = sh.Cells(80, 10)
           End With
    End If
    wb.Close (False)
End Sub
 

Ігор Гончаренко

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

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

#10

14.05.2021 18:52:57

задачу опишите
как только станет ясно ЧТО КУДА копировать — сама процудура копирования это 1 строка кода

Код
Workbooks("ИмяКниги1").Worksheets("ИмяЛистаВКниге1").Range("АдресДиапазона").Copy Workbooks("ИмяКниги2").Worksheets("ИмяЛистаВКниге2").Range("АдресЯчейки")

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

 

Игорь Нигматулин

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

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

#11

14.05.2021 18:57:59

В документ «Start» мы копируем данные с документа «Файл с которого копируем».
Задумка программы следующая. Человек вбивает число от 1  до 12 (число месяцев в году, вбиваем в ячейку AQ1 ) и при активации программы, всплывает окно с просьбой выбрать  необходимый документ, с которого будем копировать данные.  В данном документе я с помощью двумерного массива хотел выделить необходимые ячейки с данными и скопировать их в документ «Start».
Таблица в которую необходимо копировать находиться в диапазоне ячеек AC117: AO155. Документ Start
Ячейки которые необходимо копировать находятся : A 21,28,21. C 21.28,31. F 21,28,31. B 70,77,80. J70,77,80.K 70,77,80. Документ Start «Файл с которого копируем»
Данный процесс копирования подойдёт для моего случая ?)

Код
Workbooks("ИмяКниги1").Worksheets("ИмяЛистаВКниге1").Range("АдресДиапазона").Copy Workbooks("ИмяКниги2").Worksheets("ИмяЛистаВКниге2").Range("АдресЯчейки")
 

Ігор Гончаренко

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

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

#12

14.05.2021 19:17:03

да, повторите строку 18 раз изменяя только АдресДиапазона и АдресЯчейки
или на много короче — пары Адресов натолкать в массив и тогда

Код
  Dim a&, adr
  adr = Array(Array("A21", "ACxz1"), Array("A28", "ACxz2"), Array("A31", "ACxz3") ... и так еще 15 раз)
  For a = 0 To UBound(adr)
    Workbooks("ИмяКниги1").Worksheets("ИмяЛистаВКниге1").Range(adr(a)(0)).Copy _
    Workbooks("ИмяКниги2").Worksheets("ИмяЛистаВКниге2").Range(adr(a)(1))
  Next

АСxz — потому что я реально Х/З куда копировать А21 с файла источника (не только А21, а и все остальные ячейки)
и массив может быть хоть 10-имерным, если ячейки не связаны — копировать нужно по 1 штуке

Изменено: Ігор Гончаренко14.05.2021 20:24:40

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

 

Игорь Нигматулин

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

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

#13

15.05.2021 13:40:51

Большое спасибо. Ребят ещё 2 вопросика. Размер и шрифт 1 и 2 документа отличаются. Какая команда поможет произвести копирование с изменением формата .относительного того документа, в который копируем данные.
И если про копировании в документе 2 у меня стоит формула, как вставить значение ? (Пример- копирую ячейку «А1» из док1. в док.  В док. 2 стоит формула «А1/10». Я хочу вставить  значение и что бы формула просчиталась. Условно у меня стоит в док 1 значение 10, а при копировании в док.2 значение уже будет 1, т.к. произошло деление на 10)
Большое спасибо за помощь!

Код
        Sub Macros()
Dim filetoopen4 As Variant, file3 As Workbook, sheetS  As Worksheet, a As Variant, file4 As Workbook, Index As Long, i As Long
i = InputBox("Vvedite ot 1 do 12")
    Set file3 = Workbooks("1")
    Set sheetS = Workbooks("1").Worksheets("11")
    Workbooks("1").Worksheets("11").Activate
    a = sheetS.Cells(1, 24)
    filetoopen4 = Application.GetOpenFilename(Title:="?????")
    If filetoopen4 <> False Then
        Set file4 = Workbooks.Open(filetoopen4)
    Dim wb As Workbook, sh As Worksheet: Set wb = ActiveWorkbook: Set sh = wb.Worksheets("XMAO")
            With sheetS
            sh.Cells(21, 3).Copy sheetS.Cells(119, 28 + i)
'                
            End With
'           End If
    wb.Close (False)
End Sub

Изменено: Игорь Нигматулин15.05.2021 16:24:31

Although you can use CopyMemory and FillMemory, I’d strongly advise that you never keep these references around for too long. As an example I made stdRefArray class based on this exact principle, DO NOT USE THIS CODE! Read on to find out why…:

VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  'True
END
Attribute VB_Name = "stdRefArray"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
'I STRONGLY RECOMMEND AGAINST USING THIS CLASS. SEE WHY HERE:
'https://stackoverflow.com/a/63838676/6302131

'Status WIP
'High level wrapper around 2d array.

#Const DEBUG_PERF = False

'Variables for pData
Private Declare PtrSafe Sub FillMemory Lib "kernel32" Alias "RtlFillMemory" (Destination As Any, ByVal Length As Long, ByVal Fill As Byte)
Private Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpDest As Any, lpSource As Any, ByVal cbCopy As Long)


Public Data As Variant

Private Const VARIANT_SIZE As Long = 16

Public Function Create(ByRef Data As Variant) As stdRefArray
    Set Create = New stdRefArray
    Call Create.Init(Data)
End Function
Public Sub Init(ByRef DataIn As Variant)
    'Create direct reference to array:
    CopyMemory Data, DataIn, VARIANT_SIZE
End Sub

Private Sub Class_Terminate()
   'Clean up array reference
   FillMemory Data, VARIANT_SIZE, 0
End Sub

Public Function GetData(ByVal iRow as long, ByVal iCol as long) as Variant
  Attribute GetData.VB_UserMemID=0
  GetData = GetData(iRow,iCol)
End Function

My initial idea of using this class was to do something like the following:

Cars.FindCar(...).GetDoor(1).Color = Rgb(255,0,0)

where the Car class has a reference to the Cars array, and similarly with the Door class stores a reference to the Cars array, allowing for «instant» setters straight to the source of the initial data.

This works fine! But…

I came across massive issues while debugging. If you’re in debug mode, in the Door class, in the color setter, if you make a change to the structure which will need recompilation I.E. Change the name of a dimed variable, change the name of a method/property, or changed their types, Excel will instantly crash. A similar thing will occur when you click the VBA stop (square) button. Not only this, but it is extremely nasty to debug these instant crashes from Excel…

This makes the above code ensure the rest of your code base is also difficult to maintain. It will increase time to make fixes, cause a lot of frustration and make. The time saved in runtime doesn’t justify the time it’ll take to fix issues around it.

If you do ever make these array references ensure you keep their lives incredibly short, and adequately comment in between regarding debugging issues.

Note: If anyone can find a work around this crash issue (i.e. properly clean up the stack prior to VBA crash, I’d be very interested!)

Instead I highly suggest you use a simple class like this:

VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  'True
END
Attribute VB_Name = "stdRefArray"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
'Status WIP
'High level wrapper around arrays
Public Event Changed(ByVal iRow As Long, ByVal iCol As Long, ByVal Value As Variant)
Public vData As Variant

Public Function Create(ByRef Data As Variant) As stdRefArray
    Set Create = New stdRefArray
    Call Create.Init(Data)
End Function
Public Sub Init(ByRef Data As Variant)
    'Slow, but a stable reference
    vData = Data
End Sub



Public Property Get Data(Optional ByVal iRow As Long = -1, Optional ByVal iCol As Long = -1) As Variant
Attribute Data.VB_UserMemId = 0
    If iRow = -1 And iCol = -1 Then
        CopyVariant Data, vData
    ElseIf iRow <> -1 And iCol <> -1 Then
        CopyVariant Data, vData(iRow, iCol)
    Else
        stdError.Raise "stdRefArray::Data() - Invalid use of Data", vbCritical
    End If
End Property
Public Property Let Data(ByVal iRow As Long, ByVal iCol As Long, Value As Variant)
    vData(iRow, iCol) = Value
    RaiseEvent Changed(iRow, iCol, Value)
End Property
Public Property Set Data(ByVal iRow As Long, ByVal iCol As Long, Value As Object)
    Set vData(iRow, iCol) = Value
    RaiseEvent Changed(iRow, iCol, Value)
End Property
Public Property Get BoundLower(ByVal iDimension As Long) As Long
    BoundLower = LBound(vData, iDimension)
End Property
Public Property Get BoundUpper(ByVal iDimension As Long) As Long
    BoundUpper = UBound(vData, iDimension)
End Property


Private Function CopyVariant(ByRef dest As Variant, ByVal src As Variant)
    If IsObject(src) Then
        Set dest = src
    Else
        dest = src
    End If
End Function

I’ve added a few extra steps which will help with bindings. You do still very much lose a lot of native behaviour, however this is the safest bet which is also the easiest to maintain. It will also be the fastest way to get collection-like functionality without using a collection.

Usage, Car.cls:

Private WithEvents pInventory as stdRefArray
Public Function Create(ByRef arrInventory as variant)
   Set Create = new Car
   Set Create.pInventory = stdRefArray.Create(arrInventory)
End Function
Public Function GetDoor(ByVal iRow as long) as Door
   Set GetDoor = new Door
   GetDoor.init(pInventory,iRow)
End Function

Door.cls

Private pArray as stdRefArray
Private pRow as long
Private Const iColorColumn = 10
Sub Init(ByVal array as stdRefArray, ByVal iRow as long)
    set pArray = array
    pRow = iRow
End Sub
Public Property Get Color() as long
    Color = pArray(pRow,iColorColumn)
End Property
Public Property Let Color(ByVal iNewColor as long)
    pArray(pRow,iColorColumn) = iNewColor
End Property

The example probably isn’t too great lol, but hopefully you get the idea.

0mega

6 / 7 / 1

Регистрация: 05.11.2013

Сообщений: 305

1

Скопировать массив — вставить только значения

13.12.2018, 17:00. Показов 5705. Ответов 12

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Приветствую всех.

дано
Лист1 массив D6:F12
(в некоторых ячейках используются формулы, есть пустые и есть текст )

Надо скопировать и перенести на Лист2 в ячейку G7 только значения

в таком виде

Bash
1
Sheets("Лист1").Range("D6:F12").Copy Sheets(Лист2).Range("G7")

— копируются и формулы тоже
Мне надо только значения
какое существует решение ?
спасибо



0



Loya

70 / 57 / 24

Регистрация: 06.12.2015

Сообщений: 300

13.12.2018, 17:43

2

Visual Basic
1
2
3
If Not Cells(1, 1).HasFormula Then
    'Это НЕ формула, копируем.
End If



0



Остап Бонд

Заблокирован

13.12.2018, 18:18

3

Лучший ответ Сообщение было отмечено 0mega как решение

Решение

Цитата
Сообщение от 0mega
Посмотреть сообщение

какое существует решение ?

Не надо копировать,
достаточно присвоить значения

Visual Basic
1
Лист2.[g7:i13].Value = Лист1.[d6:f12].Value



1



6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

13.12.2018, 19:40

4

Как очевидно — вопрос непонятен
Не можете понятно объяснить — показывайте пример файла как есть и что нужно.



0



0mega

6 / 7 / 1

Регистрация: 05.11.2013

Сообщений: 305

13.12.2018, 21:37

 [ТС]

5

Цитата
Сообщение от Hugo121
Посмотреть сообщение

показывайте пример файла как есть и что нужно.

Игорь, сейчас не могу проверить, но похоже что Остап Бонд правильно понял вопрос

а хочу я получить такой результат
только на разных листах и в красивом правильном исполнении

Visual Basic
1
2
3
4
5
6
7
8
Sub YaXo4uTak()
Dim r_, c_ As Byte
 For r_ = 6 To 12
  For c_ = 4 To 6
   Cells(r_ + 1, c_ + 3) = Cells(r_, c_)
  Next c_
 Next r_
End Sub



0



6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

13.12.2018, 21:50

6

Ну так если Остап Бонд понял правильно — то и берите его идеальное исполнение
Ну а если то, что не значения, а формулы (или текст) не нужно копировать, и не нужно затереть в целевом листе то, что на этих местах, то тогда нужен другой вариант, и вот тогда на таких небольших объёмах вполне применим цикл по ячейкам с проверкой содержимого каждой ячейки.



1



6 / 7 / 1

Регистрация: 05.11.2013

Сообщений: 305

13.12.2018, 21:58

 [ТС]

7

Loya, спасибо за ответ

Цитата
Сообщение от Loya
Посмотреть сообщение

If Not Cells(1, 1).HasFormula Then…

я правильно понял что вы предлагаете проверять каждую ячейку ?

Добавлено через 4 минуты

Цитата
Сообщение от Hugo121
Посмотреть сообщение

если Остап Бонд понял правильно — то и берите его идеальное исполнение

Игорь, а какие еще могут быть решения кроме Остаповского варианта ?



0



6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

13.12.2018, 22:08

8

Сперва нужно определиться что именно нужно сделать
Т.к. есть разные варианты этой задачи, я ведь озвучил. Да и до меня…



0



6 / 7 / 1

Регистрация: 05.11.2013

Сообщений: 305

13.12.2018, 22:17

 [ТС]

9

Меня интересует скопировать массив и на

другом

листе вставить

только значения

есть ли еще решение , кроме того что предложил Остап ?



0



6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

13.12.2018, 22:20

10

Есть, но зачем?
Обычно записывают рекордером стандартное копирование ЗНАЧЕНИЙ, но так получите те же яйца, но в куче ненужной трухи.



0



6 / 7 / 1

Регистрация: 05.11.2013

Сообщений: 305

13.12.2018, 22:30

 [ТС]

11

Цитата
Сообщение от Hugo121
Посмотреть сообщение

Есть, но зачем?

изюм для булочек ковыряю

а еще один вопросик на сон грядущий
как сделать «переменнный » адрес чтобы брать не готовый массив а можно было подставлять Cells ?
примерно так
Лист2.[g7:i13].Value = Лист1.[cells(6, 4)&:f12].Value



0



Hugo121

6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

13.12.2018, 22:50

12

Лучший ответ Сообщение было отмечено 0mega как решение

Решение

Как вариант:

Visual Basic
1
2
3
4
5
6
7
    With Лист1
       Лист2.[g7:i13].Value = .Range(.Cells(6, 4), .[F12]).Value
    End With
или
    With Лист1
       Лист2.[g7:i13].Value = .Range(.Cells(6, 4), .Range("F12")).Value
    End With

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



0



6 / 7 / 1

Регистрация: 05.11.2013

Сообщений: 305

13.12.2018, 22:54

 [ТС]

13

благодарю за уделенное время



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

13.12.2018, 22:54

13

Копирование массива данных с одного файла в другой

Xaden

Дата: Четверг, 12.06.2014, 17:03 |
Сообщение № 1

Группа: Пользователи

Ранг: Участник

Сообщений: 73


Репутация:

0

±

Замечаний:
0% ±


Excel 2003

Всем доброго времени суток.
Возник такой вопрос, у меня есть два файла «Книга1» и «prn029NN1».
В фаил «Книга1» мне надо перенести определенные данные с фаила «prn029NN1»
Сложность заключается в том, что я как то не правильно это прописал, и у меня он копируется не верно.
Буду благодарен за наставление, советы и помощь.
В файле «prn029NN1» желтым выделил, что буду переносить, почему именно массив, потому что кол-во переносимых данных всегда будет меняться.
ЗЫ Прошу не судть строго мой макрос =)

 

Ответить

krosav4ig

Дата: Четверг, 12.06.2014, 18:44 |
Сообщение № 2

Группа: Друзья

Ранг: Старожил

Сообщений: 2346


Репутация:

989

±

Замечаний:
0% ±


Excel 2007,2010,2013

вместо [vba]

Код

wb1.Range(«E18:E» & Cells(Rows.Count, 1).End(xlUp).Row).Copy wb2.Range(«F3»)

[/vba]должно быть[vba]

Код

wb1.Range(«E18:E» & wb1.Cells(wb1.Rows.Count, 5).End(xlUp).Row).Copy wb2.Range(«F3»)

[/vba]
можно еще и так [vba]

Код

wb1.Range(«E18»).Resize(wb1.Range(«E18»).End(xlDown).Row — 17).Copy wb2.Range(«F3»)

[/vba]или так[vba]

Код

With wb1.Range(«E18»): .Resize(.End(xlDown).Row — .Row + 1).Copy wb2.Range(«F3»): End With

[/vba]


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460

Сообщение отредактировал krosav4igЧетверг, 12.06.2014, 18:52

 

Ответить

Xaden

Дата: Пятница, 13.06.2014, 09:29 |
Сообщение № 3

Группа: Пользователи

Ранг: Участник

Сообщений: 73


Репутация:

0

±

Замечаний:
0% ±


Excel 2003

Спасибо Вам огромное, все работает. Наверно не по теме, но все же хотелось бы спросить, можно ли как то переносить не всю ячейку а только определенные фразы или цифры?

 

Ответить

Hugo

Дата: Пятница, 13.06.2014, 09:39 |
Сообщение № 4

Группа: Друзья

Ранг: Участник клуба

Сообщений: 3140


Репутация:

670

±

Замечаний:
0% ±


2010, теперь уже с PQ

Так Вам нужно переносить? Тут нигде нет переноса…
Но вообще можно и переносить, и только определённые :)


excel@nxt.ru
webmoney: R418926282008 Z422237915069

 

Ответить

Xaden

Дата: Пятница, 13.06.2014, 10:33 |
Сообщение № 5

Группа: Пользователи

Ранг: Участник

Сообщений: 73


Репутация:

0

±

Замечаний:
0% ±


Excel 2003

я не правильно выразился, копирование у меня. Например у меня в ячейке данные «2. Cumparator: Вася пупкин» но перенести хочу только «Вася пупкин».
И второй вопрос, у меня ячейка в файле переноса может быть объединенной, пробовал переносить так данные получается она объединенная и копируется, можно это обойти?

 

Ответить

Hugo

Дата: Пятница, 13.06.2014, 10:48 |
Сообщение № 6

Группа: Друзья

Ранг: Участник клуба

Сообщений: 3140


Репутация:

670

±

Замечаний:
0% ±


2010, теперь уже с PQ

Опять настойчиво переносить? Не путайте помогающих!
Давайте понятный пример — что откуда куда частично копировать, и по какому критерию.
Пока предварительно думаю можно взять в массив всё, удалить из него лишнее, выгрузить. Это если делать массивом, как заказано в начале.


excel@nxt.ru
webmoney: R418926282008 Z422237915069

 

Ответить

Xaden

Дата: Пятница, 13.06.2014, 11:13 |
Сообщение № 7

Группа: Пользователи

Ранг: Участник

Сообщений: 73


Репутация:

0

±

Замечаний:
0% ±


Excel 2003

В файле желтым отметил объединенные ячейки, в них красным отметил данные которые надо скопировать и вставить в другой фаил.
и еще вопрос, можно макросом прописать, что бы скопировать весь лист и вставить его обратно как значения, вопрос заключается в том, что у меня данный фаил выходит с формулами от БД.

К сообщению приложен файл:

9585040.xlsx
(28.0 Kb)

 

Ответить

Xaden

Дата: Пятница, 13.06.2014, 11:16 |
Сообщение № 8

Группа: Пользователи

Ранг: Участник

Сообщений: 73


Репутация:

0

±

Замечаний:
0% ±


Excel 2003

или же прописать такое, выделить лист, убрать все объединения на листе, скопировать и вставить как значения :D что то я по моему уже загнул

 

Ответить

Hugo

Дата: Пятница, 13.06.2014, 11:25 |
Сообщение № 9

Группа: Друзья

Ранг: Участник клуба

Сообщений: 3140


Репутация:

670

±

Замечаний:
0% ±


2010, теперь уже с PQ

1. Ищем ячейку по известному значению (например где есть «Data eliberarii / Data livrarii : «), берём всё значение, из него выбираем последнее слово, или заменяем известное ненужное на ничего, оставляя нужное.
Если адреса ячеек постоянны — не нужно искать, всё проще.
2. Легко кодом:
[vba]

Код

Sub tt()
With ActiveSheet.UsedRange: .Value = .Value: End With
End Sub

[/vba]

По дополнению — можно, но зачем?


excel@nxt.ru
webmoney: R418926282008 Z422237915069

 

Ответить

Xaden

Дата: Пятница, 13.06.2014, 11:36 |
Сообщение № 10

Группа: Пользователи

Ранг: Участник

Сообщений: 73


Репутация:

0

±

Замечаний:
0% ±


Excel 2003

По сути это мой скромный код, на копирование с одного файла в другой, как видите у меня копируются ячейки, но проблема возникает в том, что в файле откуда я копирую есть ссылки на формулы с БД и объединенные ячейки. Вот и думаю просто как можно сделать, что бы не возникало проблем при копирование в другой фаил.
И да адрес ячейки будет постоянным, я просто не очень понимаю как мне ваш код приспособить к моему имеющемуся.

[vba]

Код

Sub Кнопка3_Щелчок()

Dim wb1 As Object, wb2 As Object
Dim ra As Range: Application.ScreenUpdating = False

Set wb1 = Windows(«prn029NN1.xlsx»).ActiveSheet
Set wb2 = Windows(«Книга1.xls»).ActiveSheet

Application.ScreenUpdating = False
wb1.Range(«D12»).Copy wb2.Range(«B1»)
wb1.Range(«L10»).Copy wb2.Range(«F1»)
wb1.Range(«D7»).Copy wb2.Range(«J1»)
wb1.Range(«L50»).Copy wb2.Range(«L1»)
wb1.Range(«E18:E» & wb1.Cells(wb1.Rows.Count, 5).End(xlUp).Row).Copy wb2.Range(«F3»)
wb1.Range(«G18:G» & wb1.Cells(wb1.Rows.Count, 5).End(xlUp).Row).Copy wb2.Range(«H3»)
wb1.Range(«F18:F» & wb1.Cells(wb1.Rows.Count, 5).End(xlUp).Row).Copy wb2.Range(«G3»)
wb1.Range(«Q18:Q» & wb1.Cells(wb1.Rows.Count, 5).End(xlUp).Row).Copy wb2.Range(«E3»)
wb1.Range(«Q18:Q» & wb1.Cells(wb1.Rows.Count, 5).End(xlUp).Row).Copy wb2.Range(«E3»)
wb1.Range(«L18:L» & wb1.Cells(wb1.Rows.Count, 5).End(xlUp).Row).Copy wb2.Range(«L3»)
wb1.Range(«K18:K» & wb1.Cells(wb1.Rows.Count, 5).End(xlUp).Row).Copy wb2.Range(«K3»)
wb1.Range(«I18:I» & wb1.Cells(wb1.Rows.Count, 5).End(xlUp).Row).Copy wb2.Range(«J3»)
wb1.Range(«J18:J» & wb1.Cells(wb1.Rows.Count, 5).End(xlUp).Row).Copy wb2.Range(«I3»)
Application.ScreenUpdating = True

End Sub

[/vba]

Сообщение отредактировал XadenПятница, 13.06.2014, 11:38

 

Ответить

Xaden

Дата: Пятница, 13.06.2014, 11:58 |
Сообщение № 11

Группа: Пользователи

Ранг: Участник

Сообщений: 73


Репутация:

0

±

Замечаний:
0% ±


Excel 2003

Извиняюсь, заработался и не внимательно прочитал ваш код, это код по моему дополнению, спасибо.

 

Ответить

Xaden

Дата: Пятница, 13.06.2014, 12:03 |
Сообщение № 12

Группа: Пользователи

Ранг: Участник

Сообщений: 73


Репутация:

0

±

Замечаний:
0% ±


Excel 2003

1. Ищем ячейку по известному значению (например где есть «Data eliberarii / Data livrarii : «), берём всё значение, из него выбираем последнее слово, или заменяем известное ненужное на ничего, оставляя нужное.
Если адреса ячеек постоянны — не нужно искать, всё проще.

Если Вас не затруднит, можно один пример к любой из ячеек? где скопировать надо только нужное.

 

Ответить

Xaden

Дата: Пятница, 13.06.2014, 16:37 |
Сообщение № 13

Группа: Пользователи

Ранг: Участник

Сообщений: 73


Репутация:

0

±

Замечаний:
0% ±


Excel 2003

Всем спасибо, вроде как разобрался.

 

Ответить

Hugo

Дата: Пятница, 13.06.2014, 17:04 |
Сообщение № 14

Группа: Друзья

Ранг: Участник клуба

Сообщений: 3140


Репутация:

670

±

Замечаний:
0% ±


2010, теперь уже с PQ

Чтоб не копировались формулы, а только значения — или копируйте «приравниванием» вроде [a1]=[b2] (или через массив сразу все смежные ячейки), или копируйте спецвставкой только значений/форматов (запишите рекордером).


excel@nxt.ru
webmoney: R418926282008 Z422237915069

 

Ответить

Понравилась статья? Поделить с друзьями:

А вот еще интересные статьи:

  • Копировать значение ячеек excel формула
  • Копировать защищенные ячейки excel
  • Копировать документы microsoft word
  • Копировать данные в ячейке excel
  • Копировать высоту строк в excel

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии