Передача текста с одного листа на другой с помощью массива - PullRequest
0 голосов
/ 02 октября 2018

Я пытаюсь передать данные с листа 3 на лист 4 на основе критерия (*).С результатами чисел, но с текстом программа не работает.Как преодолеть эту ситуацию, когда вместо номера у меня есть текст.

Public Sub TestArray3()
    'Array to copy data from Sheet3 to Sheet4 Based on criterion "in this case*"
    Dim tempVar As Integer, anotherIteration As Boolean, i As Integer
    Dim J As Integer, ArraySize As Integer, myArray() As Integer
    Dim newArray() As Integer, FinalRow As Integer, linha As Integer
    Dim counter As Integer, cel1 As Range

    Sheets("Folha3").Select
    FinalRow = Cells(Rows.Count, 1).End(xlUp).Row ' Find the last row of data
    ArraySize = FinalRow 'Get Array Size
    ReDim myArray(ArraySize - 1)
    For linha = 1 To FinalRow
        Set cel1 = Cells(linha, 1)
        If cel1 = "*" Then
            myArray(linha - 1) = Val(Cells(linha, "B").Value) 'Populate de Array
        End If
    Next linha

    ReDim newArray(LBound(myArray) To UBound(myArray)) 'Avoid zeros in Array
    For i = LBound(myArray) To UBound(myArray)
        If myArray(i) <> "0" Then
            J = J + 1
            newArray(J) = myArray(i)
        End If
    Next i

    ReDim Preserve newArray(LBound(myArray) To J)
    ArraySize = J
    Sheets("Folha4").Select 'Write data to Sheet 4 column A
    Range("A1").Resize(J - LBound(newArray) + 1)=Application.Transpose(newArray)
End Sub

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

String vs Integer

Немного неясно, что здесь происходит, но я заметил, что вы объявили все свои массивы как integer , поэтому вы не можете передать строк им.Попытайтесь выяснить, в какой массив вы пытаетесь передать строки, и объявите его как вариант или реализуйте некоторый «условный» код, такой как:

If Not IsNumeric(Cells("A1").Value) then
  Variable = 0
End If  

Read ashleedawg .

Вам не нужно выбирать рабочий лист, чтобы что-то с ним делать (см. Выбрать ).Вы можете написать

FinalRow = Sheets("Folha3").Cells(Rows.Count, 1).End(xlUp).Row

или

Sheets("Folha4").Range("A1").Resize(J - LBound(newArray) + 1) _
= Application.Transpose(newArray)

и сохранить строку, но, что более важно, не прыгать в рабочем буфере.Еще лучше использовать С :

With Sheets("Folha3")
    FinalRow = .Cells(Rows.Count, 1).End(xlUp).Row ' Find the last row of data
    ArraySize = FinalRow 'Get Array Size
    ReDim myArray(ArraySize - 1)
    For linha = 1 To FinalRow
        Set cel1 = .Cells(linha, 1)
        If cel1 = "*" Then
            myArray(linha - 1) = Val(.Cells(linha, "B").Value) 'Populate de Array
        End If
    Next linha
End With

Обратите внимание на '. ' перед каждой ячейкой (.cells), это относится к объекту листа.

Попробуйте использовать переменные для объектов.Когда вы пишете

Sheets("folha3"). 

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

Dim oWb as Workbook
Dim oWs as Worksheet
Set oWb = Activeworkbook
Set oWs = oWb.Sheets("Folha3")

Теперь, когда вы пишете:

oWs.

, IntelliSense показывает вамсвойства и методы объекта листа: например, «Активировать», «Ячейки», «Копировать», «Удалить», «Вставить» и т. д.

С помощью еще нескольких строк кода вы узнаете гораздо больше.

0 голосов
/ 02 октября 2018

Мне неясно, куда вы на самом деле пытаетесь вставить данные из / в, но вот один [из нескольких] способов перемещения данных между листами, включая как с транспонированием, так и без него

Надеюсь, этот примерследует очистить шаги:

Sub copyRangeToOtherSheet()

    Dim lastRow As Long, lastCol As Long, rgSrc As Range, rgDest As Range, arr() As Variant

    With ThisWorkbook.Sheets("Sheet1")                               'set source worksheet

        lastRow = .Cells(Rows.Count, "A").End(xlUp).Row              'find last row of Col A
        lastCol = .Cells(1, Columns.Count).End(xlToLeft).Column      'find last col of Row 1
        Set rgSrc = Range(.Range("A1"), .Cells(lastRow, lastCol))    'create range (from A1)

    End With

    arr = rgSrc                                                      'dump range into array

    With ThisWorkbook.Sheets("Sheet2")                               'set destination sheet

      'OPTION #1: Populate destination in "original" orientation
        Set rgDest = .Range("A1")                           'set destination top-left corner
        Set rgDest = rgDest.Resize(UBound(arr, 1), UBound(arr, 2))  'fit to array rows/col's
        rgDest = arr                                          'dump array to worksheet range

      'OPTION #2: Populate destination in "transposed" orientation
        Set rgDest = .Range("D1")                           'set destination top-left corner
        Set rgDest = rgDest.Resize(UBound(arr, 2), UBound(arr, 1))  'fit to array col's/rows
        rgDest = WorksheetFunction.Transpose(arr)  'dump transposed array to worksheet range

    End With

End Sub

Обратите внимание, что это проще всего, если вы не установите размер массива заранее - Excel изменит его размер автоматически, если массив еще не определен (чтоВот почему он объявлен только как arr() As Variant).

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

Если мы собираемся Transpose ячеек, мы должны поменять число строк / столбцов в целевом диапазоне.

img


Дополнительная информация:

...