首页 > 解决方案 > 将具有相应 ID 号的行复制到不同的工作表中

问题描述

我有一个用户表单,可让您输入 ID 号,我希望将具有相应 ID 号的行复制到单元格未对齐的不同工作表中。

我尝试使用数组作为数据的目的地,但是当我运行它时它什么也没做。我知道我可以用丑陋的方式做到这一点,并将每个单元格编码到另一个单元格,但我认为使用数组来复制正在复制的数据会起作用,现在我需要知道如何将所有目标单元格放在一个变量并在那里复制数据

Dim ws As Worksheet
Set ws = Sheets("Arkiv")
Dim DN As Worksheet
Set DN = Sheets("DN")

idRow = Sheets("Arkiv").Columns("A:A").Find(what:=IDnum).Row
IDnum = TextBox1.Text

'Dim shipFrom As Range
    'Set shipFrom = Sheets("Arkiv").Range("B" & idRow)

Dim goTo1 As Variant
goTo1 = Array(DN.Range("D9"), DN.Range("E9"), DN.Range("I9"), DN.Range("C20"), DN.Range("D20"), DN.Range("E45"), DN.Range("G20"), DN.Range("H20"), DN.Range("I20"))

Dim data As Variant
data = Array(ws.Range("B" & idRow), ws.Range("C" & idRow), ws.Range("D" & idRow), ws.Range("E" & idRow), ws.Range("F" & idRow), ws.Range("G" & idRow), ws.Range("H" & idRow), ws.Range("I" & idRow))

goTo1 = data

我希望变量“数据”中的数据按照我将它们放入数组中的相应顺序复制到“goTo1”变量内部的单元格中。enter code here

标签: excelvbauserform

解决方案


  1. 如果您使用 find 方法,请始终指定LookAt参数,否则 VBA 使用上次使用的任何内容(用户或 VBA)。

  2. 您需要遍历地址,并一一复制它们。您不能一次复制非连续范围。

所以这样的事情应该有效。

Option Explicit

Public Sub CopyRanges()
    Dim wsSource As Worksheet
    Set wsSource = ThisWorkbook.Worksheets("Arkiv")
    Dim wsDestination As Worksheet
    Set wsDestination = ThisWorkbook.Worksheets("DN")

    Dim IDnum As String
    IDnum = TextBox1.Text

    Dim idRow As Long
    idRow = wsSource.Columns("A:A").Find(What:=IDnum, LookAt:=xlWhole).Row

    Dim SourceAddresses() As Variant
    SourceAddresses = Array("B" & idRow, "C" & idRow, "D" & idRow, "E" & idRow, "F" & idRow, "G" & idRow, "H" & idRow, "I" & idRow)

    Dim DestinationAddresses() As Variant
    DestinationAddresses = Array("D9", "E9", "I9", "C20", "D20", "E45", "G20", "H20", "I20") 

    If UBound(SourceAddresses) <> UBound(DestinationAddresses) Then
        MsgBox "Amount of source addresses must be the same amount as destination addresses"
        Exit Sub
    End If     

    Dim i As Long
    For i = LBound(SourceAddresses) To UBound(SourceAddresses)
        wsDestination.Range(DestinationAddresses(i)).Value = wsSource.Range(SourceAddresses(i)).Value
    Next i
End Sub

推荐阅读