Excel 为变量分配某些数据所在单元格的地址后,Sub不工作
我有一个奇怪的问题。只要我不给变量Excel 为变量分配某些数据所在单元格的地址后,Sub不工作,excel,addressof,vba,Excel,Addressof,Vba,我有一个奇怪的问题。只要我不给变量komorka_k和komorka_y分配单元格地址,该代码就可以工作。由于标有“LINE 1”和“LINE 2”的两行代码被禁用,VBA宏可以正常工作。这种活动的原因是什么?分配一个不与子模块的任何其他部分连接的值如何可能使它的行为有所不同 Public stara_wartosc As Variant Public czy_wiekszy_zakres As Boolean Private Sub Worksheet_Change(ByVal Target
komorka_k
和komorka_y
分配单元格地址,该代码就可以工作。由于标有“LINE 1”和“LINE 2”的两行代码被禁用,VBA宏可以正常工作。这种活动的原因是什么?分配一个不与子模块的任何其他部分连接的值如何可能使它的行为有所不同
Public stara_wartosc As Variant
Public czy_wiekszy_zakres As Boolean
Private Sub Worksheet_Change(ByVal Target As Range)
Dim x, y As Integer
Dim x_err As Integer
Const y_err = 4
Dim nowa_wartosc As Variant
Dim komorka_x As String
Dim komorka_y As String
Const kon_col = 72
komorka_x = ""
komorka_y = ""
x = Target.row
y = Target.Column
nowa_wartosc = Target.Value
If czy_wiekszy_zakres = True Then
stara_wartosc = nowa_wartosc
End If
On Error GoTo TypeMismatch
If stara_wartosc <> nowa_wartosc And czy_wiekszy_zakres = False Then
If Target.Worksheet.Cells(x, 2).Value = "" Or Target.Worksheet.Cells(x, 2).Value = 0 Then
Application.EnableEvents = False
Target.ClearContents
MsgBox Prompt:="Zmieniłeś wartość komórki bez wpisania numeru zlecenia." & vbCrLf & "Wpisz nr zlecenia!", Title:="ZACHOWUJESZ SIĘ NIEWŁAŚCIWIE, MÓJ DROGI!"
Target.Worksheet.Cells(x, 2).Activate
Application.EnableEvents = True
Exit Sub
End If
With ActiveWorkbook.Worksheets("Errata")
komorka_x = .Range("A:A").Find(x, LookIn:=xlValues).Address 'LINE 1
komorka_y = .Range("B:B").Find(y, LookIn:=xlValues).Address 'LINE 2
x_err = .Cells(Rows.Count, 1).End(xlUp).row + 1
If .Cells(x_err, 1).Value = 0 Or .Cells(x_err, 1).Value = "" Then
.Cells(x_err, 1).Value = x
End If
If .Cells(x_err, 2).Value = 0 Or .Cells(x_err, 2).Value = "" Then
.Cells(x_err, 2).Value = y
End If
Set_values:
.Cells(x_err, y_err - 1).Value = stara_wartosc
.Cells(x_err, y_err).Value = Target.Value
.Cells(x_err, y_err + 1).Value = Target.Worksheet.Cells(x, 2).Value
End With
End If
TypeMismatch:
If Err = 13 Then
Exit Sub
End If
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Cells.Count = 1 Then
stara_wartosc = Target.Value
czy_wiekszy_zakres = False
Else
czy_wiekszy_zakres = True
End If
End Sub
Public stara_wartosc作为变体
公共czy_wiekszy_zakres作为布尔
私有子工作表_更改(ByVal目标作为范围)
将x、y调整为整数
Dim x_错误为整数
常数y_err=4
Dim nowa_wartosc作为变型
Dim komorka_x作为字符串
Dim komorka_y作为字符串
Const kon_col=72
komorka_x=“”
komorka_y=“”
x=Target.row
y=目标.列
nowa_wartosc=目标值
如果czy_wiekszy_zakres=真,那么
stara_wartosc=nowa_wartosc
如果结束
关于错误转到类型不匹配
如果stara_wartosc nowa_wartosc和czy_wiekszy_zakres=False,那么
如果Target.Worksheet.Cells(x,2).Value=”“或Target.Worksheet.Cells(x,2).Value=0,则
Application.EnableEvents=False
Target.ClearContents
MsgBox提示符:=“Zmieniłeśwartośćkomórki bez wpisani numeru zlecenia.”和vbCrLf&“Wpisz nr zlecenia!”,标题:=“ZachowujesSiĘNIEWŁAŚCIWIE,MÓJ DROGI!”
目标。工作表。单元格(x,2)。激活
Application.EnableEvents=True
出口接头
如果结束
使用ActiveWorkbook.Worksheets(“勘误表”)
komorka_x=.Range(“A:A”).Find(x,LookIn:=xlValues)。地址“第1行”
komorka_y=.Range(“B:B”).Find(y,LookIn:=xlValues)。Address'第2行
x_err=.Cells(Rows.Count,1).End(xlUp).row+1
如果.Cells(x_err,1).Value=0或.Cells(x_err,1).Value=”“,则
.Cells(x_err,1).Value=x
如果结束
如果.Cells(x_err,2).Value=0或.Cells(x_err,2).Value=”“则
.Cells(x_err,2).Value=y
如果结束
设置_值:
.Cells(x_err,y_err-1)。Value=stara_wartosc
.Cells(x_err,y_err).Value=Target.Value
.Cells(x_err,y_err+1).Value=Target.Worksheet.Cells(x,2).Value
以
如果结束
类型不匹配:
如果Err=13,则
出口接头
如果结束
端接头
专用子工作表\u选择更改(ByVal目标作为范围)
如果Target.Cells.Count=1,则
stara_wartosc=目标值
czy_wiekszy_zakres=错误
其他的
czy_wiekszy_zakres=正确
如果结束
端接头
可能
komorka_x = .Range("A:A").Find(x, LookIn:=xlValues).Address
komorka_y = .Range("B:B").Find(y, LookIn:=xlValues).Address
什么也没找到。因此,.Address
失败,因为没有找到结果,也没有地址
然后由于On Error转到TypeMismatch
它跳转到这里的错误处理
因此,请确保.Find
不是空的:
Dim FoundX As Range
Set FoundX = .Range("A:A").Find(x, LookIn:=xlValues)
If Not FoundX Is Nothing Then
komorka_x = FoundX.Address
Else
MsgBox "Nothing found for x=" & x
End If
大概
komorka_x = .Range("A:A").Find(x, LookIn:=xlValues).Address
komorka_y = .Range("B:B").Find(y, LookIn:=xlValues).Address
什么也没找到。因此,.Address
失败,因为没有找到结果,也没有地址
然后由于On Error转到TypeMismatch
它跳转到这里的错误处理
因此,请确保.Find
不是空的:
Dim FoundX As Range
Set FoundX = .Range("A:A").Find(x, LookIn:=xlValues)
If Not FoundX Is Nothing Then
komorka_x = FoundX.Address
Else
MsgBox "Nothing found for x=" & x
End If
注:①
Dim x,y为整数
将y
定义为Integer
但x
As变量
您需要为每个变量指定一种类型。② Excel的行数超过了Integer
所能处理的行数,因此始终使用Long
而不是Integer
(使用Integer
没有任何好处):Dim x长,y长
可能至少有一个值找不到,因此出现错误。感谢您的建议,但它没有帮助。1.我不知道Dim var1,var2作为某种类型总是将var1定义为变体。2.我不需要使用长变量,因为我假设工作表中的最大行数相对较小。@Paweł您应该使用Long
。在VBA()中使用Integer
没有任何好处。您可以始终使用Long
而不是Integer
。它可以防止您遇到任何问题,而且不需要任何费用!注:① Dim x,y为整数
将y
定义为Integer
但x
As变量
您需要为每个变量指定一种类型。② Excel的行数超过了Integer
所能处理的行数,因此始终使用Long
而不是Integer
(使用Integer
没有任何好处):Dim x长,y长
可能至少有一个值找不到,因此出现错误。感谢您的建议,但它没有帮助。1.我不知道Dim var1,var2作为某种类型总是将var1定义为变体。2.我不需要使用长变量,因为我假设工作表中的最大行数相对较小。@Paweł您应该使用Long
。在VBA()中使用Integer
没有任何好处。您可以始终使用Long
而不是Integer
。它可以防止您遇到任何问题,而且不需要任何费用!