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)