我决定将一个包含VBA代码的旧excel文件转换为VSTO应用。工作表中有几个命名范围,并且这些范围可以在运行时(行数)变化。因此,从一开始,范围只有一排,每列有1到多列。 一旦知道需要多少行,就可以相应地调整范围的大小。我遇到的问题是,给定命名范围的给定工作表上的change事件不会针对已添加的新行触发。例如,在工作表中将一个名为scores的命名范围定义为$ E $ 1:$ V $ 1,并在运行时进行更改以将行数扩展到20($ E $ 1:$ V $ 20)。如果第一行上的一列发生更改,则会触发sheetx_scores_change事件,但其他行不会触发。
如果在重新命名之前查看命名范围,它将显示正确的单元格数(18),并且ReferTo属性也正确。调整大小后,ReferTo也将更新,但单元格计数仍为18。
Public Sub Initialize
for each nr As Excel.Name in allsheets("test").Names
If nr.Comment = "" then
r = nr.RefersToRange
nr.RefersTo=r.Resize(lr,r.Columns.count)
End if
Next
End sub
现在,如果我在工作表的代码中更改此大小,则会使用正确的单元格数更新计数,但更改事件将不再触发该范围内的任何单元格。
Sheet Code ...
Private Sub UpdateRange
system.Diagnostics.debug.print( sheet4_scores.Count & " - " &
sheet4_scores.Columns.Count & " - " & Sheet4_Scores.Rows.count)
Dim NamedRange1 As Microsoft.Office.Tools.Excel.NamedRange
NamedRange1 = Me.Sheet4_Scores
system.Diagnostics.debug.print(NamedRange1.RefersToRange.rows.Count)
Me.Sheet4_Scores.RefersTo= "='Test'!$e$5:$v$41"
system.Diagnostics.debug.print( sheet4_scores.Count & " - " &
sheet4_scores.Columns.Count & " - " & Sheet4_Scores.Rows.count)
system.Diagnostics.debug.print( NamedRange1.Count & " - " &
NamedRange1.Columns.Count & " - " & NamedRange1.Rows.count)
End Sub
Debug output...
18 - 18 - 1
29
666 - 18 - 37
666 - 18 - 37
那么,如何在运行时更新命名范围,并使所有单元格触发命名范围的更改事件?