2017-03-14 173 views
0

我想在我的Excel表格中循環行。該行基於讀入工作表的數據進行移動,並且列是可變的,並根據數據進行更改。所有的按鈕都是由另一個宏生成的,按下後將其內容輸入到我想要讀取的行中。 For ExampleExcel VBA:基於變量選擇單元格

我的問題是,當我嘗試引用帶有變量的單元格時,無論我嘗試什麼,我都會得到一個錯誤。最常見的錯誤是'類型不匹配'

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 

任何幫助將非常感激!

+6

您正嘗試從多個單元格中獲取單個值。只選擇具有該值的單元格。你需要改變這一行:Set MyRange = ws.Range(Cells(RowNum,i),Cells(RowNum + 1,i))',因此它只涉及一個單元格。我的猜測是,你要'設置MyRange = ws.Cells(ROWNUM + 1,I)' –

+6

您嘗試將MULT單元格區域的值(這是一個數組)比較單一的價值,你不能用'='來實現。什麼目的?此外,您還需要'ws'來調用'Cells':'Set MyRange = ws.Range(ws.Cells(RowNum,i),ws.Cells(RowNum + 1,i))' – Rory

+1

Thanks @ScottCraner and @羅裏!!!!只引用最上面的單元格已經解決了這個問題。感謝您的幫助,我沒有意識到您只需引用合併單元格的頂部單元格即可獲取其內容。 – sheds141

回答

0

@Scott Craner和@Rory已經提供了答案。

可以更換所有IfElseIf S和使用Select Case,如下面的代碼:

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 
+0

這不是提供的解決方案。 – sheds141

+0

@ sheds141我沒有說這是解決方案,我說這個解決方案是由「Scott Craner」和「Rory」在上面的評論中提供的。我建議最重要的是,如果您不想使用此功能,請將您的'If's和'ElseIf'替換爲'Select Case',這取決於您 –

0

已經@Scott克萊納和@Rory提供了答案。 它只是簡單地引用合併單元格的左上角單元格而不是合併單元格中的所有單元格。

Set MyRange = ws.Range(ws.Cells(RowNum, i), ws.Cells(RowNum, i)) 

增加了ws。之前Cells()也是一個很好的提示,以防止更改表和工作簿的代碼。

謝謝大家!