VBA:如何选择与变量值匹配的行中的单元格?

VBA:如何选择与变量值匹配的行中的单元格?,vba,excel,Vba,Excel,我有两张床单。Sheet1有两行:列名和值。 表2是一个主表,其中包含所有可能的列名。我需要将表1中的值复制到相应的列中 我想我可以通过一个匹配函数来实现这一点,到目前为止我有: Sub dynamic_paste() Dim Columnname As String Dim inputvalue As String Dim starter As Integer Dim i As Integer starter = 0 For i = 1 To 4 'replace 4 with range

我有两张床单。Sheet1有两行:列名和值。 表2是一个主表,其中包含所有可能的列名。我需要将表1中的值复制到相应的列中

我想我可以通过一个匹配函数来实现这一点,到目前为止我有:

Sub dynamic_paste()

Dim Columnname As String
Dim inputvalue As String
Dim starter As Integer
Dim i As Integer
starter = 0

For i = 1 To 4
'replace 4 with rangeused.rows.count?

Sheets("sheet1").Select
Range("a1").Select
ActiveCell.Offset(0, starter).Select
Columnname = ActiveCell
'sets columnname variable

ActiveCell.Offset(1, 0).Select
inputvalue = ActiveCell
'sets inputname variable

Sheets("sheet2").Select

'**Cells(0, WorksheetFunction.Match(Columnname, Rows(1), 0)).Select**

Range("a1").Offset(1, starter).Value = inputvalue
'inputs variable in the next cell along

starter = starter + 1
Next

End Sub
我需要了解如何使用columnname变量作为匹配值,然后向下偏移到第一行为空,然后将该单元格的值更改为名为inputvalue的变量

额外要点:如果代码没有找到匹配的值,我需要确保代码不会中断,如果可能,请将任何不匹配的值放在行的末尾?

这是怎么回事:

Dim LR As Long, X As Long, LC As Long, COL As Long
Dim RNG As Range, CL As Range

Option Explicit

Sub Test()

LR = Sheets(2).Cells.SpecialCells(xlCellTypeLastCell).Row 'Get last used row in your sheet
LC = Sheets(2).Cells(1, Sheets(2).Columns.Count).End(xlToLeft).Column 'Get last used column in your sheet
Set RNG = Sheets(2).Range(Sheets(2).Cells(1, 1), Sheets(2).Cells(1, LC))

'Loop through all the columns on your sheet with values
For X = 1 To Sheets(1).Cells(1, Sheets(1).Columns.Count).End(xlToLeft).Column
    Set CL = RNG.Find(Sheets(1).Cells(1, X).Value, lookat:=xlWhole)
    If Not CL Is Nothing Then
        COL = CL.Column
        Sheets(2).Cells(LR + 1, COL).Value = Sheets(1).Cells(2, X).Value 'Get the value on LR offset by 1
    Else
        Sheets(2).Cells(1, Sheets(2).Cells(1, Sheets(2).Columns.Count).End(xlToLeft).Column).Value = Sheets(1).Cells(1, X).Value
        Sheets(2).Cells(LR + 1, Sheets(2).Cells(1, Sheets(2).Columns.Count).End(xlToLeft).Column).Value = Sheets(1).Cells(2, X).Value
    End If
Next X

End Sub
这样可以避免使用select。这是非常值得推荐的

这是第1页:

这是第二张:

代码如下:

Option Explicit

Sub DynamicPaste()

    Dim col As Long
    Dim wks1 As Worksheet: Set wks1 = Worksheets(1)
    Dim wks2 As Worksheet: Set wks2 = Worksheets(2)

    For col = 1 To 3
        Dim currentRow As Long
        currentRow = WorksheetFunction.Match(wks2.Cells(1, col), wks1.Columns(1))
        wks2.Cells(2, col) = wks1.Cells(currentRow, 2)
    Next col

End Sub
这是代码后面的第2页:

Option Explicit

Sub DynamicPaste()

    Dim col As Long
    Dim wks1 As Worksheet: Set wks1 = Worksheets(1)
    Dim wks2 As Worksheet: Set wks2 = Worksheets(2)

    For col = 1 To 3
        Dim currentRow As Long
        currentRow = WorksheetFunction.Match(wks2.Cells(1, col), wks1.Columns(1))
        wks2.Cells(2, col) = wks1.Cells(currentRow, 2)
    Next col

End Sub

这是必须读取的-

Cells0,总是会抛出错误。第一行是数字1,因此Cells1,1是最小值。好的,但即使我更改,我也会得到一个对象定义或应用程序定义的错误。当然。但你离我们更近了一步。尝试以下操作-Sheetssheet2.Cells1,WorksheetFunction.MatchColumnname,Sheetssheet2.Rows1,0。选择并查看错误出现的位置。我也遇到了相同的错误:调试器没有高亮显示一行。嗨,这几乎可以工作,但不完全可以。我所有的值都是字符串,不确定这是否会改变任何东西,但sheet2 row2有3个值,其中所有值都是相同的。嗨,除了一件事之外,这一切都很完美!它将新值放在每列的底部。有时我的列会丢失值。因此,这些值将从各自的行中删除。有办法解决吗?@CharlieFelix,我已经更新了答案。我这样做是为了它不会在不在主数据中的变量上出错。它不一定再短了:@charlieFelix,没问题。看看哪里写着“如果不是,CL什么都不是,那么。。。。。如果',结束吗?您可以在两者之间创建一个else来处理您的奖金问题中缺少的值。好运气如果不是cl什么都不是那么XYZ else将单元格值复制到行的末尾?