Excel VBA:基于变量选择单元格

Excel VBA:基于变量选择单元格,vba,excel,Vba,Excel,我正在尝试循环浏览excel工作表中的一行。行根据读入图纸的数据移动,列是可变的,并根据数据进行更改。所有按钮都是由另一个宏生成的,按下时,将其内容输入到我要读取的行中。 我的问题是,当我尝试用我的变量引用单元格时,无论我尝试什么,我总是会得到一个错误。最常见的错误是“类型不匹配” Sub Save() Dim RowNum As Integer Dim LastColumn As Long Dim ws As Worksheet Dim MyRange As Range Dim answer

我正在尝试循环浏览excel工作表中的一行。行根据读入图纸的数据移动,列是可变的,并根据数据进行更改。所有按钮都是由另一个宏生成的,按下时,将其内容输入到我要读取的行中。

我的问题是,当我尝试用我的变量引用单元格时,无论我尝试什么,我总是会得到一个错误。最常见的错误是“类型不匹配”

Sub Save()
Dim RowNum As Integer
Dim LastColumn As Long
Dim ws As Worksheet
Dim MyRange As Range
Dim answer As Integer
Dim i As Integer

Set ws = ActiveWorkbook.Sheets("Main")

answer = MsgBox("Sind Sie sicher, dass Sie speichen möchten?", vbYesNo + vbQuestion, "Sind Sie sicher")
If answer = vbNo Then
    Exit Sub
End If

Application.ScreenUpdating = False

'Finds the location of the button ("Speichen Freigegebene Protokolle") is pressed in order to locate the desired row
RowNum = ws.Buttons(Application.Caller).TopLeftCell.row
'Finds how many columns there are with this data set
LastColumn = ws.Cells(11, ws.Columns.count).End(xlToLeft).Column

'cycles through columns of the row
For i = 7 To LastColumn
    Set MyRange = ws.Range(Cells(RowNum, i), Cells(RowNum + 1, i))

    If MyRange.Value = "Gut" Then  '##Type Mismatch error##
        'Save
    ElseIf MyRange.Value = "Einzelfreigeben" Then
        'Save
    ElseIf MyRange.Value = "Nacharbeit" Then
        'Dont Save
    ElseIf MyRange.Value = "Ausschuss" Then
        'Dont save
    ElseIf MyRange.Value = "" Then
        Err = MsgBox("Fehler! Sie haben eine Protokole zu pruefen vergessen.", vbOKOnly, "Fehler")
        Exit Sub
    End If

Next i
End Sub

任何帮助都将不胜感激

答案已经由@Scott Craner和@Rory提供

您可以替换所有的
If
ElseIf
并使用
选择案例
,如下所示:

Select Case MyRange.Value
    Case "Gut"
        'Save
    Case "Einzelfreigeben"
        'Save
    Case "Nacharbeit"
        'Dont Save
    Case "Ausschuss"
        'Dont save
    Case ""
        Err = MsgBox("Fehler! Sie haben eine Protokole zu pruefen vergessen.", vbOKOnly, "Fehler")
        Exit Sub
End Select

答案已经由@Scott Craner和@Rory提供。 这就像只引用合并单元格的左上角单元格而不是合并单元格中的所有单元格一样简单

    Set MyRange = ws.Range(ws.Cells(RowNum, i), ws.Cells(RowNum, i))
添加了ws。在此之前,
Cells()
也是防止代码更改工作表和工作簿的好方法


谢谢大家

您正试图从多个单元格中获取单个值。仅选择具有该值的单元格。您需要更改此行
Set MyRange=ws.Range(Cells(RowNum,i)、Cells(RowNum+1,i))
,使其仅引用一个单元格。我猜您想要
设置MyRange=ws.Cells(RowNum+1,i)
您试图将多个单元格范围(即数组)的值与单个值进行比较,而使用
=
无法做到这一点。目的何在?另外,您还需要
ws
来调用
Cells
调用:
Set MyRange=ws.Range(ws.Cells(RowNum,i),ws.Cells(RowNum+1,i))
谢谢@ScottCraner和@Rory!!!!仅引用顶部单元格就解决了问题。谢谢你的帮助,我没有意识到你只需要引用合并单元格的顶部单元格就可以得到它的内容。你好,Sheds,欢迎来到这个网站。我们喜欢在这里把问题切中要害,所以我编辑了你的问题,把它删减了。如果您对更改不满意,请随时重新编辑。这不是提供的解决方案。@sheds141我没有说这是解决方案,我说解决方案是由“Scott Craner”和“Rory”在上面的评论中提供的。除此之外,我建议将您的
If
ElseIf
替换为
Select Case
,如果您不想,您不必使用此选项-这取决于您自己