范围。以空格VBA结束

范围。以空格VBA结束,vba,excel,Vba,Excel,我正在尝试创建一个动态范围,该范围将从一组固定的单元格返回所有结果,不幸的是,我在使用range.End方法时遇到了问题,因为中间有空格。例如,A8:A10中可能没有值,但它可能从A11开始,并且该行将包含数据。所有表格都会有所不同,但它固定在下面的单元格范围内 我还看到了Range.Find,但我也无法让它工作 单元格范围为:A8:F18 lastRow = ThisWorkbook.Worksheets("Sheet2").Cells(Rows.Count, 2).End(xlUp).Row

我正在尝试创建一个动态范围,该范围将从一组固定的单元格返回所有结果,不幸的是,我在使用
range.End
方法时遇到了问题,因为中间有空格。例如,
A8:A10
中可能没有值,但它可能从
A11
开始,并且该行将包含数据。所有表格都会有所不同,但它固定在下面的单元格范围内

我还看到了Range.Find,但我也无法让它工作

单元格范围为:
A8:F18

lastRow = ThisWorkbook.Worksheets("Sheet2").Cells(Rows.Count, 2).End(xlUp).Row + 1

ThisWorkbook.Worksheets("Sheet2").Range("B" & lastRow).Formula = _
    Source.Worksheets("SUMMARY DATA SHEET").Range("A8").Value
ThisWorkbook.Worksheets("Sheet2").Range("D" & lastRow).Formula = _
    Source.Worksheets("SUMMARY DATA SHEET").Range("D8").Value
ThisWorkbook.Worksheets("Sheet2").Range("A" & lastRow).Formula = _
    Source.Worksheets("SUMMARY DATA SHEET").Range("B4").Value
ThisWorkbook.Worksheets("Sheet2").Range("E" & lastRow).Formula = _
    Source.Worksheets("SUMMARY DATA SHEET").Range("F8").Value
ThisWorkbook.Worksheets("Sheet2").Range("C" & lastRow).Formula = _
    Source.Worksheets("SUMMARY DATA SHEET").Range("E8").Value


听起来您需要找到包含
范围(“A8:A18”)
中数据的第一行,如果该假设是正确的,那么下面是一个示例:

Sub foo()
Dim Source As Workbook
Dim wsTarget As Worksheet, wsSource As Worksheet
Dim sourceRange As Range
Dim targetLastRow As Long, sourceFirstRow As Long
Set Source = ThisWorkbook ' ### MODIFY AS NEEDED

Set wsSource = Source.Worksheets("Sheet1") '#Source.Worksheets("SUMMARY DATA SHEET")
Set sourceRange = wsSource.Range("A8:A18")
sourceFirstRow = sourceRange.Find("*", After:=wsSource.Range("A8")).Row

Set wsTarget = ThisWorkbook.Worksheets("Sheet2")
targetLastRow = wsTarget.Cells(Rows.Count, 2).End(xlUp).Row + 1

wsTarget.Range("B" & targetLastRow).Value = _
    wsSource.Range("A" & sourceFirstRow).Value

wsTarget.Range("D" & targetLastRow).Value = _
    wsSource.Range("D" & sourceFirstRow).Value

' etc...

End Sub
如果您想传输第8-18行中所有有数据的单元格中的值,同时假设第一行之后的每一行都有数据,那么我认为您只需要修改
sourceRange
,并使用
Resize
对目标进行一些更改:

Sub foo()
Dim Source As Workbook
Dim wsTarget As Worksheet, wsSource As Worksheet
Dim sourceRange As Range
Dim targetLastRow As Long, sourceFirstRow As Long
Set Source = ThisWorkbook ' ### MODIFY AS NEEDED

Set wsSource = Source.Worksheets("Sheet1") '#Source.Worksheets("SUMMARY DATA SHEET")
Set sourceRange = wsSource.Range("A8:A18")
sourceFirstRow = sourceRange.Find("*", After:=wsSource.Range("A8")).Row
Set sourceRange = wsSource.Range("A" & sourceFirstRow & ":A18")
Set wsTarget = ThisWorkbook.Worksheets("Sheet2")
targetLastRow = wsTarget.Cells(Rows.Count, 2).End(xlUp).Row + 1

wsTarget.Range("B" & targetLastRow).Resize(sourceRange.Rows.Count, 1).Value = _
    sourceRange.Value

wsTarget.Range("D" & targetLastRow).Resize(sourceRange.Rows.Count, 1).Value = _
    sourceRange.Offset(, 3).Value

'etc...
End Sub

因此,您想查找数据在范围
A8:F18
中的最后一个单元格,其中A8和F18之间可能有任意数量的空行?您的问题不清楚;我知道您想要复制位于“汇总数据表”单元格A8、D8、B4、F8和E8中的值;并将这些值粘贴到“Sheet2”中的B、D、A、E和C列的第一个空行中。如果我错了,请澄清您的问题。@GMalc我使用A8、D8、F8和E8作为范围中的第一行。基本上,我希望它拾取A8:F18范围内的所有非空值。另一个参考是每个行项目B4相同的单个单元格值。为了重申这个例子,我可能有从第10行开始到第15行结束的值,但是由于该范围是固定的,我仍然需要代码来搜索第8-18行并返回所有非空白;是否要复制“Range”(“A8:F18”)”中包含数据的任何单元格,然后将其粘贴到第一个空行的“Sheet2”中?您希望如何将从
范围(“A8:F18”)
复制的数据粘贴到“Sheet2”?您的示例显示,您希望将
范围(“A8:F18”)
中特定单元格的数据粘贴到“Sheet2”中的特定单元格中,是否要复制特定数据并粘贴到“Sheet2”中的特定单元格中?还是将所有复制的值粘贴到第一个空行?您可以使用FOR/IF循环完成任务,但需要知道要对复制的数据执行什么操作。@GMalc I添加了第10行到第16行中的上述范围的示例。我有整个范围A8:F18的公式,但可能没有根据公式条件将数据拉入这些单元格。同样为了坚持,B列不会被拉,这就是为什么我希望它穿过A列(A8:A18),然后拉所有非空白,然后是D列(D8:D18),然后粘贴(“Sheet2”)等等。因此,在上面的特定示例中,我希望代码返回A10:A16、D10:D16等中的所有值,但我仍然需要它为每列搜索所有第8-18行,因为我在其他Wrkshts上可能有不同的结果
Sub foo()
Dim Source As Workbook
Dim wsTarget As Worksheet, wsSource As Worksheet
Dim sourceRange As Range
Dim targetLastRow As Long, sourceFirstRow As Long
Set Source = ThisWorkbook ' ### MODIFY AS NEEDED

Set wsSource = Source.Worksheets("Sheet1") '#Source.Worksheets("SUMMARY DATA SHEET")
Set sourceRange = wsSource.Range("A8:A18")
sourceFirstRow = sourceRange.Find("*", After:=wsSource.Range("A8")).Row
Set sourceRange = wsSource.Range("A" & sourceFirstRow & ":A18")
Set wsTarget = ThisWorkbook.Worksheets("Sheet2")
targetLastRow = wsTarget.Cells(Rows.Count, 2).End(xlUp).Row + 1

wsTarget.Range("B" & targetLastRow).Resize(sourceRange.Rows.Count, 1).Value = _
    sourceRange.Value

wsTarget.Range("D" & targetLastRow).Resize(sourceRange.Rows.Count, 1).Value = _
    sourceRange.Offset(, 3).Value

'etc...
End Sub