Vba 基于当前区域粘贴用户输入

Vba 基于当前区域粘贴用户输入,vba,excel,Vba,Excel,我正在处理一组每周数据。每周,我都会在工作表中添加一组新数据。然后,我想提示用户输入并将其粘贴到当前区域范围内的特定列。现在,我的脚本将提示用户输入,然后在工作表中查找最后一组数据的最后一行。然后,我使用当前区域激活集合数据的第一行。由于数据将在E列到O列,我希望用户输入的输入在A列到D列 但是,当我运行脚本时,它不会粘贴来自集合数据第一行的用户输入,也不会在集合数据的最后一行停止。根据这个示例,我希望输出从第388行开始,最后到第406行。我从脚本得到的结果将粘贴到第404行,直到第811行

我正在处理一组每周数据。每周,我都会在工作表中添加一组新数据。然后,我想提示用户输入并将其粘贴到当前区域范围内的特定列。现在,我的脚本将提示用户输入,然后在工作表中查找最后一组数据的最后一行。然后,我使用当前区域激活集合数据的第一行。由于数据将在E列到O列,我希望用户输入的输入在A列到D列

但是,当我运行脚本时,它不会粘贴来自集合数据第一行的用户输入,也不会在集合数据的最后一行停止。根据这个示例,我希望输出从第388行开始,最后到第406行。我从脚本得到的结果将粘贴到第404行,直到第811行

现在,我只尝试一个名为“setup”的工作表,但我需要修改20个不同名称的工作表的脚本

这是我的剧本:

Option Explicit
Public week, datedone, data, location As Variant

Sub pqr()

week = InputBox("Week:")
datedone = InputBox("Date:")
data = InputBox("Data:")
location = InputBox("Location:")

Dim ws As Worksheet
Dim x As Workbook
Dim LastRow As Long
Dim FirstRow As Long

Set x = ThisWorkbook

For Each ws In x.Worksheets
    If ws.Name = "setup" Then
    LastRow = Cells(Rows.Count, "E").End(xlUp).Row
    ws.Range("E" & LastRow).Activate
    FirstRow = ActiveCell.CurrentRegion.Cells(1, 1).Activate


With ws.Range("A" & LastRow).CurrentRegion
    ws.Range(.Cells(FirstRow, 1), .Cells(LastRow, 1)).Value = week
    ws.Range(.Cells(FirstRow, 2), .Cells(LastRow, 2)).Value = datedone
    ws.Range(.Cells(FirstRow, 3), .Cells(LastRow, 3)).Value = data
    ws.Range(.Cells(FirstRow, 4), .Cells(LastRow, 4)).Value = location
End With

End If

Next

End Sub
这是前一周(12周)的数据(包含用户输入数据)和当前周(13周)的数据(不包含用户输入数据)的样子

这是我从脚本中得到的结果

这就是我期望得到的结果

你可以试试这样的

Dim Rng As Range
Set Rng = ws.Range("E:E").SpecialCells(xlCellTypeConstants, 2)
Set Rng = Rng.Areas(Rng.Areas.Count).Cells(1)

FirstRow = Rng.Row
If ws.Cells(FirstRow, 1) = "" Then
    LastRow = FirstRow
Else
    LastRow = ws.Cells(Rows.Count, 1).End(xlUp).Row + 1
End If
ws.Cells(LastRow, 1) = week
ws.Cells(LastRow, 2) = datedone
ws.Cells(LastRow, 3) = Data
ws.Cells(LastRow, 4) = Location
完整的代码应该如下所示…

Public week, datedone, data, location As Variant

Sub pqr()
Dim ws As Worksheet
Dim x As Workbook
Dim LastRow As Long
Dim FirstRow As Long
Dim Rng As Range

week = InputBox("Week:")
datedone = InputBox("Date:")
data = InputBox("Data:")
location = InputBox("Location:")


Set x = ThisWorkbook
Set ws = Sheets("setup")

On Error Resume Next
Set Rng = ws.Range("E:E").SpecialCells(xlCellTypeConstants, 2)
On Error GoTo 0
If Not Rng Is Nothing Then
    Set Rng = Rng.Areas(Rng.Areas.Count).Cells(1)
    FirstRow = Rng.Row
    If ws.Cells(FirstRow, 1) = "" Then
        LastRow = FirstRow
    Else
        LastRow = ws.Cells(Rows.Count, 1).End(xlUp).Row + 1
    End If
    ws.Cells(LastRow, 1) = week
    ws.Cells(LastRow, 2) = datedone
    ws.Cells(LastRow, 3) = data
    ws.Cells(LastRow, 4) = location
End If
End Sub
EDIT2:

Public week, datedone, data, location As Variant

Sub pqr()
Dim ws As Worksheet
Dim x As Workbook
Dim FirstRow As Long, LastRow As Long, n As Long

Dim Rng As Range

week = InputBox("Week:")
datedone = InputBox("Date:")
data = InputBox("Data:")
location = InputBox("Location:")


Set x = ThisWorkbook
Set ws = Sheets("setup")

On Error Resume Next
Set Rng = ws.Range("E:E").SpecialCells(xlCellTypeConstants, 2)
n = Rng.Areas(Rng.Areas.Count).Rows.Count
On Error GoTo 0
If Not Rng Is Nothing Then
    Set Rng = Rng.Areas(Rng.Areas.Count).Cells(1)
    FirstRow = Rng.Row
    LastRow = FirstRow + n - 1
    ws.Range(ws.Cells(FirstRow, 1), ws.Cells(LastRow, 1)) = week
    ws.Range(ws.Cells(FirstRow, 2), ws.Cells(LastRow, 2)) = datedone
    ws.Range(ws.Cells(FirstRow, 3), ws.Cells(LastRow, 3)) = data
    ws.Range(ws.Cells(FirstRow, 4), ws.Cells(LastRow, 4)) = location
End If
End Sub

因为我计划基于列的存在来填充列A:D,所以我尝试了脚本,但随后出现了运行时错误“91”:未设置对象变量或块变量。问题是什么?为什么在For循环中存在类似于If ws.Name=“setup”这样的条件时要在工作表上循环,因为这意味着代码将只在名为setup的工作表上执行?我已经添加了完整的代码,运行此代码并让我知道这是否适用于您。请注意,代码正在查找最后一个块中的第一行,假设列E包含字符串常量,如图中所示的字段a、b、c、d…等(但不是由公式导出的字符串)。Hi,结果没有错误,但是,输出仅显示在集合数据的第一行。也许,我必须添加循环,以便输出将从集合数据的第一行粘贴到最后一行吗?从示例中,输出仅显示在第388行。这意味着输出显示在正确的第一行,即第388行。下次运行代码时,代码将把输出放在第389行。这不是你想要达到的吗?