【发布时间】:2016-07-20 14:45:38
【问题描述】:
我在 Excel 中构建的表中有一堆不同类别的子项。每个 sub 都有自己的数据,它从各种平面文件中提取,但它们都有相同的结尾,即根据它在行和列中对齐的类别标题将每个值放入特定的单元格中。因此,所有不同的是开头的 if 语句。有没有办法把这段代码放在一个单独的子或函数或其他东西中,并且在每个其他子中只调用一次,这样我就不必经常输入它/如果我想改变它,我会只需要在一个地方更改吗?下面是代码示例:
这部分在每个sub的开头,根据行头变化
Sub calccategory()
For k = 1 To ActiveSheet.Cells(Rows.Count, 4).End(xlUp).Row
If Cells(k, 4) = "row 1" Then
这部分是我想放在函数或子中的部分,因为它每次都是一样的
Dim CWS As Worksheet
Workbooks(ThisBook).Activate
For j = 5 To 15
For g = 1 To ActiveSheet.Cells(3, Columns.Count).End(xlToLeft).Column
If Cells(3, g) = "col1" Then
With Range(Cells(k, j * 4 + 2), Cells(k + 1, j * 4 + 4))
On Error Resume Next
CWS.Cells(k, g).Value = col1_n
End With
ElseIf Cells(3, g) = "col2" Then
With Range(Cells(k, j * 4 + 2), Cells(k + 1, j * 4 + 4))
On Error Resume Next
CWS.Cells(k, g).Value = col2_n
End With
ElseIf Cells(3, g) = "col3" Then
With Range(Cells(k, j * 4 + 2), Cells(k + 1, j * 4 + 4))
On Error Resume Next
CWS.Cells(k, g).Value = col3_n
End With
ElseIf Cells(3, g) = "col 4" Then
With Range(Cells(k, j * 4 + 2), Cells(k + 1, j * 4 + 4))
On Error Resume Next
CWS.Cells(k, g).Value = col4_n
End With
ElseIf Cells(3, g) = "col5" Then
With Range(Cells(k, j * 4 + 2), Cells(k + 1, j * 4 + 4))
On Error Resume Next
CWS.Cells(k, g).Value = col5_n
End With
End If
Next g
On Error GoTo 0
Next j
这部分将再次成为每个 sub 末尾的一部分,而不是我想要的此功能的一部分
End If
Next k
End Sub
【问题讨论】:
-
您希望在单独的函数中使用的代码块是否需要任何输入?为什么你不能把它放在它自己的 sub 中,然后从你的 main 函数中调用那个 sub?
-
我试过了——如果我这样做,我必须将其他字母变量(如 k 和 j)放入循环中,这会破坏目的,而且它也不会映射到正确的行
-
If Cells(k,4) = row 1"是什么?你的意思是Cells(k,4)所在的行是第1行吗? -
你真的会添加更多关于你的代码应该做什么的信息。有很多奇怪的东西,最奇怪的是
With Range(Cells(k, j * 4 + 2), Cells(k + 1, j * 4 + 4))引用根本没有被利用,因为下一个End With中的任何语句都没有任何点(。)......无论如何我会添加一个我能理解的答案
标签: vba function excel subroutine