2016-09-16 15 views
2

それぞれのプロパティIDを持つプロパティを含むブックがあります。 以下のコードは、comboBox内のリストから選択されたIDに対応する行を見つけて、フォームの残りのフィールドにその行のデータを入力することを目的としています。VBAランタイムエラー1004(.offSet()を使用)

Private Sub propertyCodeCombo_change() 
    Set wks = Application.Workbooks("Book1.xlsm").Worksheets("Property") 
    Dim propertyCell As Range 
    Set propertyCell = wks.Range("A2") 
    Do Until propertyCell.Value = propertyCodeCombo.Value 
     Set propertyCell = propertyCell.Offset(1, 0) <--Error Occurs here 
    Loop 
    addressText = propertyCell.Offset(0, 1).Value 
    suburbText = propertyCell.Offset(0, 2).Value 
    propertyTypeCombo = propertyCell.Offset(0, 3).Value 
    bedroomsText = propertyCell.Offset(0, 4).Value 
    bathroomsText = propertyCell.Offset(0, 5).Value 
    weeklyRentalFeeText = propertyCell.Offset(0, 6).Value 
    statusCombo = propertyCell.Offset(0, 7).Value 
    commisionText = propertyCell.Offset(0, 8).Value 
    ownerCodeCombo = propertyCell.Offset(0, 9).Value 
End Sub 

その下に見られるように、私はほとんど同じコードを持っているように私は完全に誤りや機能を生じない奇妙見つけます。あなたが一致するものを見つけていないので、

Set wks = Application.Workbooks("Book1.xlsm").Worksheets("Property") 
Dim propertyCell As Range 
Set propertyCell = wks.Range("A2") 
Do Until IsEmpty(propertyCell) 
    Set propertyCell = propertyCell.Offset(1, 0) 
Loop 
+0

ユーザーフォームがロードされていますか? –

+0

@captainGrumpyうん、userFormがロードされているのですが、なぜ、 'propertyCell.entireColumn.Find(propertyCodeCombo.Value ,, xlWhole)'だけでなく、 – SamCar

+0

が読み込まれますか?もし見つからない場合はエラーをキャッチしてください。 – Rosetta

答えて

1

あなたのコードは、エラーを取得しますので、あなたのオフセットコマンドは、シートの最後の行に到達してしまいます。もう1行をオフセットすると、エラーが発生します。

あなたの他の同様のコードが動作する理由です - 別のテストを適用するので、ループを先に終了します。

それは、配列を使用する代わりに、オフセットとしてあなたは、このコードではるかに優れたパフォーマンスを得られます:

Private Sub propertyCodeCombo_change() 
    Dim wks As Worksheet 

    Set wks = ThisWorkbook.Worksheets("Property") 
    Dim propertyCell As Range 
    Set propertyCell = wks.Range("A2") 

    Dim comboValue As Variant 
    comboValue = propertyCodeCombo.Value 

    Dim props As Variant 
    props = wks.UsedRange.Value 

    If IsArray(props) Then 
    Dim propRow As Long 
     For propRow = LBound(props) To UBound(props) 

     If props(propRow, 1) = comboValue Then 
      addressText = props(propRow, 2) 
      suburbText = props(propRow, 3) 
      propertyTypeCombo = props(propRow, 4) 
      bedroomsText = props(propRow, 5) 
      bathroomsText = props(propRow, 6) 
      weeklyRentalFeeText = props(propRow, 7) 
      statusCombo = props(propRow, 8) 
      commisionText = props(propRow, 9) 
      ownerCodeCombo = props(propRow, 10) 
      Exit For 
     End If 
     Next propRow 
    End If 

End Sub 
+1

バリアントに返された 'application.match'が適切かもしれません。私は操作が通常、 '.UsedRange'を配列に吸い込む前に完了していることがわかります。もちろん、後続の値のすべてを参照する追加の時間もあります。 – Jeeped

関連する問題