Excel 将cell.value从一个范围传递到另一个子区域

Excel 将cell.value从一个范围传递到另一个子区域,excel,vba,range,cell,Excel,Vba,Range,Cell,我有以下代码: Dim WS1、WS2作为工作表 范围 暗淡单元格作为范围 以字符串形式显示文本 子名称测试() 设置WS1=ActiveWorkbook.Sheets(“第1页”) 设置WS2=ActiveWorkbook.Sheets(“Sheet1”) x=2 lRow1=WS1.Cells(Rows.Count,“B”).End(xlUp).Row 设置chatRange=WS1.Range(“B”和x,“B”和lRow1) 对于范围内的每个单元格 如果cell.Offset(0,11)

我有以下代码:

Dim WS1、WS2作为工作表
范围
暗淡单元格作为范围
以字符串形式显示文本
子名称测试()
设置WS1=ActiveWorkbook.Sheets(“第1页”)
设置WS2=ActiveWorkbook.Sheets(“Sheet1”)
x=2
lRow1=WS1.Cells(Rows.Count,“B”).End(xlUp).Row
设置chatRange=WS1.Range(“B”和x,“B”和lRow1)
对于范围内的每个单元格
如果cell.Offset(0,11).Value=“已接受”,则
txt=单元格偏移量(0,18).Value
名称分裂
如果结束
下一个细胞
端接头
子名称分裂()
作为整数的Dim i
Dim FullName作为变量
尺寸x为字符串,单元格为范围
昏暗的lRow2与长
全名=删除空白行(拆分(txt,vbLf))
lRow2=WS2.Cells(Rows.Count,2).End(xlUp).Row+1
WS2.Cells(lRow2,1).Value=cell.Value'您的
NameSplit()
过程应该这样声明:

Sub NameSplit(WS2 as Worksheet, cell as Range)
'
'
'your code here
'
'
End Sub
call NameSplit(WS2, cell)
应该这样称呼:

Sub NameSplit(WS2 as Worksheet, cell as Range)
'
'
'your code here
'
'
End Sub
call NameSplit(WS2, cell)

您可以从
NameSplit()

中的声明中删除
单元格作为范围,但始终使用
选项Explicit
,尽管在这种情况下不会突出显示问题

如前所述,您将
单元格
声明为范围(在NameSplit函数中第二次),但从未设置它。这就是你至少会出错的原因

正如其他人提到的,如果先声明这些值,则可以轻松地将它们传递到其他子对象中。请参阅基于您的示例(未测试)代码:

Option Explicit
'Use global variables only if really needed, but was a good try.

Sub NameTest()
    Dim WS1 As Worksheet, WS2 As Worksheet
    Dim chatRange As Range
    Dim cell As Range
    Dim txt As String

    Set WS1 = ActiveWorkbook.Sheets("Page 1")
    Set WS2 = ActiveWorkbook.Sheets("Sheet1")

    x = 2

    lRow1 = WS1.Cells(WS1.Rows.Count, "B").End(xlUp).row

    Set chatRange = WS1.Range("B" & x, "B" & lRow1)

    For Each cell In chatRange
        If cell.Offset(0, 11).Value = "Accepted" Then
            txt = cell.Offset(0, 18).Value
            Call NameSplit(WS2, cell, txt)
        End If

    Next cell

End Sub

Sub NameSplit(wsDest As Worksheet, rngCell As Range, strTxt As String)    'You can pass any objects through. By default they are passed ByRef (search for ByRef vs ByVal)
    Dim i As Integer
    Dim FullName As Variant
    Dim x As String
    Dim lRow2 As Long

    FullName = RemoveBlankLines(Split(strTxt, vbLf))
    lRow2 = WS2.Cells(WS2.Rows.Count, 2).End(xlUp).row + 1

    wsDest.Cells(lRow2, 1).Value = rngCell.Value
    wsDest.Cells(lRow2, 2).Value = rngCell.Offset(0, 2).Value
    wsDest.Cells(lRow2, 3).Value = rngCell.Offset(0, 6).Value
    wsDest.Cells(lRow2, 4).Value = rngCell.Offset(0, 18).Value
End Sub

编辑:完全限定
Rows.Count
WS1.Rows.Count
和分别
WS2.Rows.Count
以防止错误,并更正为注释中的默认值。(感谢@chris neilsen指出)。

您将
单元格
声明为范围(在NameSplit函数中第二次),但从未设置它。这就是你至少会出错的原因。。我将尝试修复您的代码并作为答案发布。您需要将
cell
作为范围参数传递给
Namesplit
子项。旁注:您的
WS1
变量是
变量
,您的行应该如下所示:
Dim WS1作为工作表,WS2作为工作表
,如果这些宏是同一模块的一部分,您可以使用
Public
变量将您声明的内容传递给其他宏。还要注意,细胞很容易与细胞混淆!不要使用过时的
Call
语句。应该是
NameSplit单元
@chris neilsen:为什么?这只是品味的问题。我发现使用
调用函数(arg1、arg2、arg3等)
比使用
函数arg1、arg2、arg3等
更容易阅读语句。另外,它在实际调用外部函数/sub的代码中也很突出。我不会将
call
语句称为过时。如果想在不改变
Sub
ByRef
/
ByVal
行为的情况下使用括号,它是有用的。我会发现
调用
是有用的,因为对Sub的调用对我来说就像对void函数的调用。或者调用一个我对返回值不感兴趣的函数。我仍在学习,有时可能会令人沮丧,谢谢您花时间回答。非常好用。我从一个初学者那里看到了很多糟糕的代码,我想说你的思路是对的!继续,干得好。在VBA中,默认参数传递实际上是
ByRef
。存在可能导致错误的非限定单元格引用
WS2.Cells(Rows.Count,2)
应该是
WS2.Cells(WS2.Rows.Count,2)
谢谢@chrisneilsen的更正,我已经更新了答案@Madmidle,Chris提到的教训是,你应该始终限定你的引用,否则:
WS2.Cells(Rows.Count,2)
相当于
WS2.Cells(ActiveSheet.Rows.Count,2)