Excel 基于单元格值从其他工作表复制数据

Excel 基于单元格值从其他工作表复制数据,excel,vba,Excel,Vba,我不确定如何使用VBA,并想寻求帮助,了解如何在excel上使用VBA 宏的目标是从工作表(即“选定的问题”)复制一列数据“B”,并将其粘贴到另一工作表(即“试卷”)的固定列“a”中 然后,粘贴的值将与另一张工作表(即“第1章”)相匹配,如果“试卷”中的单元格包含与“第1章”第“a”列中的另一单元格相匹配的值,则它会将“第1章”中的特定数据行复制到“试卷”中 宏从“C”列开始的第一步开始重复,将值粘贴到“测试纸”的“A”列的下一个可用空白单元格中 我目前的代码如下: Sub Test()

我不确定如何使用VBA,并想寻求帮助,了解如何在excel上使用VBA

  • 宏的目标是从工作表(即“选定的问题”)复制一列数据“B”,并将其粘贴到另一工作表(即“试卷”)的固定列“a”中

  • 然后,粘贴的值将与另一张工作表(即“第1章”)相匹配,如果“试卷”中的单元格包含与“第1章”第“a”列中的另一单元格相匹配的值,则它会将“第1章”中的特定数据行复制到“试卷”中

  • 宏从“C”列开始的第一步开始重复,将值粘贴到“测试纸”的“A”列的下一个可用空白单元格中

我目前的代码如下:

Sub Test()
"

我不知道如何继续我的VBA和目前的编码只允许我实现我的第一步


感谢所有能给我的帮助。

试试这种方法。它应该能帮你找到你想要的东西。未测试:
这些循环和检查单个单元格的概念可以应用于许多不同的情况。策略性地将循环放置在其他循环中,使用行号和列号作为计数器,并利用.Cells(行、列)格式


使用循环,使用.Cells(rowNum,colNum)而不是.Range(“A1”)可以在尝试计算动态范围集时提供更大的灵活性。这样你就可以得到最后一行或最后一列,然后按编号循环行和列。您好,谢谢您的回复,我已经将代码输入到VBA中,它几乎完全可以工作。是否可以修改代码,使宏开始匹配来自不同工作表的问题,而不仅仅是第1章?例如,在第一次将“B”列从“选定的问题”复制到“试卷”并与“第1章”匹配后,是否可以将“C”列从“选定的问题”复制到“试卷”并与“第2章”匹配?如果你能帮我完成前两个循环,我就可以在我剩下的章节里继续。好的。B列与第1章一起,第2章的C列更新了解决方案,一次解决一个聊天者,基本上只是将第二个主循环移动到第一个循环内。将列复制到试卷后,为章节号创建一个变量,然后使用该计数器决定下一张是哪张。插入一个tempRow变量来跟踪我们在试卷上留下的地方,这样就不会重复整个循环。如果不是一路都可以的话,那应该能帮你解决大部分问题。谢谢你的回复,我会尝试VBA代码,如果它能工作,我会再次通知你!(:您好,我已经尝试过编码。但是,对于我使用的VBA代码,我无法从除第1章和第2章以外的任何其他章节检索问题。我有标有“第1-19章”的章节。感谢您在这方面的建议。
Set Source = Sheets("Questions Selected")
Worksheets.Add(After:=Worksheets("Main Page")).Name = "Test Paper" 'Adds a Sheet called "Test Paper"
Dim rng As Range
Set Destination = Sheets("Test Paper")
Source.Select
Set rng = Range("B2:B" & Source.Cells(Source.Rows.Count, "B").End(xlUp).Row)
With rng
    .Copy
Destination.Columns(1).PasteSpecial xlPasteValues
End With
End Sub
Private Sub TableCheck()

Dim lastQsRow           'Last Row on Questions Selected
Dim lastQCol As Long    'Last Column on Questions Selected
Dim qColNum As Long     'Questions Selected Column Number

Dim lastTestRow As Long 'Last Test Paper Row
Dim tempRow As Long     'tempRow to keep track of place on Test Paper between loops
Dim testRow As Long     'Editing row on Test paper

Dim chapNum As Long     'Chapter Number for the Sheet Name
Dim lastChCol As Long   'Last Chapter Column
Dim lastChRow As Long   'Last Chapter Row
Dim chRow As Long       'Chaper Row
Dim chColNum As Long    'Chapter Column Number for copying entire row Loop.

'Set the Last Column on "Questions Selected"
lastQCol = Sheets("Questions Selected").Cells(1, Columns.Count).End(xlToLeft).Column
testRow = 2  'Set Row of "Test Paper" to 2 or whatever your first Non-Header Row is.

'-----PHASE ONE - COPY COLUMNS FROM "QUESTIONS SELECTED" TO "TEST PAPER" ----- BIG LOOP
For qColNum = 2 To lastQCol  'Begin Column Loop at column 2("B")
    tempRow = testRow
    lastQsRow = Sheets("Questions Selected").Cells(Rows.Count, qColNum).End(xlUp).Row
    'Get the Last Row of Column
    For qsRow = 2 To lastQsRow 'Loop from first NON-Header Row to the Last Row) on "Questions Selected"
        Sheets("Test Paper").Cells(testRow, "A").Value = Sheets("Questions Selected").Cells(qsRow, qColNum).Value
        testRow = testRow + 1
    Next qsRow

    '----PHASE TWO - COMPARE EACH ROW OF "TEST PAPER" TO "CHAPTERs" AND COPY MATCHING ROWS ---- INNER LOOP
    chapNum = 1
    'Get Last Row of "Chapter" & "Test Paper"
    lastChRow = Sheets("Chapter " & chapNum).Cells(Rows.Count, "A").End(xlUp).Row
    lastTestRow = Sheets("Test Paper").Cells(Rows.Count, "A").End(xlUp).Row

    'Loop through "Test Paper"
    For testRow = tempRow To lastTestRow
        'Loop through "Chapter"
        For chRow = 2 To lastChRow
            'Compare Value of Current Row on "Test Paper" to "Chapter"
            If Sheets("Test Paper").Cells(testRow, "A").Value = Sheets("Chapter " & chapNum).Cells(chRow, "A").Value Then
                lastChCol = Sheets("Chapter " & chapNum).Cells(chRow, Columns.Count).End(xlToLeft).Column
                'If Matching, copy every column from "Chapter" to "Test Paper"
                For chColNum = 2 To lastChCol
                    Sheets("Test Paper").Cells(testRow, chColNum).Value = Sheets("Chapter " & chapNum).Cells(chRow, chColNum).Value
                Next chColNum
            End If
        Next chRow
    Next testRow

    chapNum = chapNum + 1

Next qColNum

End Sub