タスク:
私はExcel2013で働いています。動的な名前付き範囲にパラメーターを追加するためのユーザーフォームをVBAに書き込もうとしました。名前付き範囲はすべて1つのシートに保持され、insert> tableを使用して作成されました。範囲を選択し、既存の値を表示して、新しい値を取得します。実際に範囲に付加価値を付けるまでは、すべてうまくいきました。
問題:
ユーザーフォームを実行しようとすると、ほとんどの場合Excelがシャットダウンします。ことわざ:
「実行時エラー '-2147417848(80010108)'オブジェクト '範囲'のメソッドXが失敗しました」
コードを分解するさまざまな段階で、さまざまなメソッド(前回チェックしたときは「_Default」)を使用しました。
症状:
私が見つけたこの行の後、私はエラーを受け取ります:
Cells(y, x) = v
ここで、y
とx
は整数で、v
はユーザーフォームから取得した文字列です。デバッグ中に、すべての値が定義されており、値があることを確認しました。さらに、(変数としてではなく)手動で入力された同じ数値のイミディエイトウィンドウが機能します!
それは仕事をすることを通して続いたけれども、それはほとんど機能しません。
誰かがそれが壊れた理由を言うことができればそれは大いにありがたいです!
キャプションと潜在的な値のいくつかは、重要な場合に備えて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ウィンドウに値を追加します。
ユーザーフォームのレイアウト:
問題は私のバージョンのExcelにあるようです。問題が私のコピーにあるのか、2013年全般にあるのかわからない。同じマシン上のExcel2007では、指定された提案を含むユーザーフォームがエラーなしで継続的に機能しました。別のバージョンで試してみると、後でコメントで更新されます。
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):
その(Name)
プロパティは、その特定のワークシートを表すグローバルスコープオブジェクトにアクセスするためにVBAコードで使用できる識別子を定義します。それがSheet1
であると仮定すると、次のことができます。
Sheet1.Cells(x, y) = v
それでも失敗する場合は、アクセスしているRange
オブジェクトと設定しているプロパティについてさらに具体的にすることができます。
Dim target As Range
Set target = Sheet1.Cells(x, y)
target.Value = v
通常、それでも違いはありません。しかし、あなたはRange
呼び出しを行っているようです。これは、また暗黙的にActiveSheet
を呼び出しています。
これらを削除し、明示的なオブジェクト参照を処理することから始めます。
次に、スプレッドシートロジックをフォームから取得する作業を行います。そのボタンクリックハンドラーはあまりにも多くのことを行っています-しかし私は コードレビュー 領域に脱線します-意図したとおりに機能するようになったら、そこにコードを投稿してください!