web-dev-qa-db-ja.com

UserFormを実行するほとんどの場合、Excel 2013で実行時エラー-2147417848(80010108)が発生するのはなぜですか?

タスク:
私はExcel2013で働いています。動的な名前付き範囲にパラメーターを追加するためのユーザーフォームをVBAに書き込もうとしました。名前付き範囲はすべて1つのシートに保持され、insert> tableを使用して作成されました。範囲を選択し、既存の値を表示して、新しい値を取得します。実際に範囲に付加価値を付けるまでは、すべてうまくいきました。

問題:
ユーザーフォームを実行しようとすると、ほとんどの場合Excelがシャットダウンします。ことわざ:

「実行時エラー '-2147417848(80010108)'オブジェクト '範囲'のメソッドXが失敗しました」

コードを分解するさまざまな段階で、さまざまなメソッド(前回チェックしたときは「_Default」)を使用しました。

症状:

  1. 私が見つけたこの行の後、私はエラーを受け取ります:

    Cells(y, x) = v
    

    ここで、yxは整数で、vはユーザーフォームから取得した文字列です。デバッグ中に、すべての値が定義されており、値があることを確認しました。さらに、(変数としてではなく)手動で入力された同じ数値のイミディエイトウィンドウが機能します!

  2. それは仕事をすることを通して続いたけれども、それはほとんど機能しません。

誰かがそれが壊れた理由を言うことができればそれは大いにありがたいです!

キャプションと潜在的な値のいくつかは、重要な場合に備えてUnicodeで書かれていますが、すべて英語で書いてみました。

Private Sub UserForm_Initialize()
    ' Preparing all controls of UserForm
    Sheet2.Activate
    Me.LB_parameter.SetFocus
    Me.LB_parameter.value = ""
    Me.LB_elements.RowSource = ""
    Me.L_element.Enabled = False
    Me.TB_element.Enabled = False
    Me.TB_element.Locked = True
    Me.Btn_Add.Enabled = False
    Me.Btn_Add.Locked = True
End Sub

Private Sub LB_parameter_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    ' Filling the existing list of values for the selected parametr
    If Me.LB_parameter.value <> "" Then
        Me.LB_elements.RowSource = "D_" & Me.LB_parameter.value & "s"
        Me.L_element.Enabled = True
        Me.TB_element.Enabled = True
        Me.TB_element.Locked = False
        Me.TB_element.SetFocus
    End If
End Sub

Private Sub TB_element_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    ' Catching the event of filling out the potential new value
    Me.Btn_Add.Enabled = True
    Me.Btn_Add.Locked = False
    Me.L_element.Enabled = False
    Me.TB_element.Enabled = False
    Me.TB_element.Locked = True
End Sub

Private Sub Btn_Add_Click()
    If Me.TB_element.Text = "" Then
        ' Check if Empty
        MsgBox ("Âû íå âïèñàëè çíà÷åíèå!")
        ' Reset the UserForm
        Me.Btn_Add.Enabled = False
        Me.Btn_Add.Locked = True
        Me.L_element.Enabled = True
        Me.TB_element.Enabled = True
        Me.TB_element.Locked = False
        Me.TB_element.SetFocus
    Else
        ' check if exists
        Dim str
        For Each str In range("D_" & Me.LB_parameter.value & "s")
            If Me.TB_element.Text = str Then
                MsgBox ("Ââåäåííîå çíà÷åíèå óæå ñóùåñòâóåò!")
                ' reset the UserForm
                Me.Btn_Add.Enabled = False
                Me.Btn_Add.Locked = True
                Me.L_element.Enabled = True
                Me.TB_element.Enabled = True
                Me.TB_element.Locked = False
                Me.TB_element.SetFocus
                Me.TB_element.value = ""
                Exit Sub
            End If
        Next str
        ' add to the range here
        Dim x As Integer, y As Integer, v As String
        y = range("D_" & Me.LB_parameter.value & "s").Rows.Count + 2
        x = Me.LB_parameter.ListIndex + 1
        v = Me.TB_element.value
        ' Next line causes break down
        Cells(y, x) = v
        MsgBox ("Âû äîáàâèëè ýëåìåíò:'" & v & "' äëÿ ïàðàìåòðà '" & Me.LB_parameter.value & "'.")
        ' Reset the Userform
        Me.LB_parameter.SetFocus
        Me.LB_parameter.value = ""
        Me.LB_elements.RowSource = ""
        Me.L_element.Enabled = False
        Me.TB_element.Enabled = False
        Me.TB_element.Locked = True
        Me.Btn_Add.Enabled = False
        Me.Btn_Add.Locked = True
    End If
End Sub

シートパラメータとnamedrangesウィンドウに値を追加します。

Sheet I add values to the parametrs and namedranges window

ユーザーフォームのレイアウト:

The UserForm layout

4

問題は私のバージョンのExcelにあるようです。問題が私のコピーにあるのか、2013年全般にあるのかわからない。同じマシン上のExcel2007では、指定された提案を含むユーザーフォームがエラーなしで継続的に機能しました。別のバージョンで試してみると、後でコメントで更新されます。

1
Cells(y, x) = v

この呼び出しはこれの省略形です:

ActiveSheet.Cells(y, x).Value = v

なぜクラッシュするのかはわかりませんが、Rangeオブジェクトの_DefaultプロパティがValueであるため、ここで試してみるのは、私が何をしているのかをより明確にすることです。達成しようとしています、すなわち:

  • 正確にどのWorksheetが変更されることになっていますか?
  • 正確にどのRangeが参照されていますか?

ActiveSheetを操作することはめったにありません。ほとんどの場合、操作しているオブジェクトを正確に正確に知っています。オブジェクトを使用してみてください。新しいものを作成できます。

Dim target As Worksheet
Set target = ThisWorkbook.Worksheets("pl")

...または、プロパティでシートにコード名を付けることができます)ツールウィンドウ(F4):

Properties toolwindow showing properties of a worksheet module

その(Name)プロパティは、その特定のワークシートを表すグローバルスコープオブジェクトにアクセスするためにVBAコードで使用できる識別子を定義します。それがSheet1であると仮定すると、次のことができます。

Sheet1.Cells(x, y) = v

それでも失敗する場合は、アクセスしているRangeオブジェクトと設定しているプロパティについてさらに具体的にすることができます。

Dim target As Range
Set target = Sheet1.Cells(x, y)
target.Value = v

通常、それでも違いはありません。しかし、あなたはRange呼び出しを行っているようです。これは、また暗黙的にActiveSheetを呼び出しています。

これらを削除し、明示的なオブジェクト参照を処理することから始めます。

次に、スプ​​レッドシートロジックをフォームから取得する作業を行います。そのボタンクリックハンドラーはあまりにも多くのことを行っています-しかし私は コードレビュー 領域に脱線します-意図したとおりに機能するようになったら、そこにコードを投稿してください!

1
Mathieu Guindon