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
。它可以防止您遇到任何问题,而且不需要任何费用!