0

おそらく単純なものが欠けているのでしょうが、ListRows.Add は私に悲しみを与えています。関数は次のとおりです。

Sub addEmployee(employeeName As String, tableToAddTo As ListObject)
   Dim newRow As ListRow

   Set newRow = tableToAddTo.ListRows.Add()
   newRow.Range.Cells(1, 1).Value = employeeName
   tableToAddTo.Sort.Apply
End Sub

ほとんどの場合、これで問題なく動作します。ただし、関数がワークシートの特定のテーブルで実行されるたびに、ListRows.Add への呼び出しに続く行は実行されず (少なくともデバッガーはそれを示します)、行はテーブルに追加されません。何か考え/アイデアはありますか?

アップデート:

投稿以来、私が学んだことは次のとおりです。Sub にスタブ データをフィードすると、正常に動作します。例えば:

Sub driver() 
    Dim myTable As ListObject 
    Set myTable = getTableObject("myTableName") 
    Call addEmployee("myName", myTable)
End Sub

注: getTableObject はワークシートを循環し、一致する名前の ListObject を返します。

コードが呼び出されるコンテキストを扱う問題のようです。失敗した場合、数式 (関数呼び出し) がさまざまなワークシートのさまざまなセルに配置されています。数式には、他のセルのデータへの参照が含まれています。他のセルのデータが変更されると、式が呼び出され、上記の addEmployee Sub が呼び出されます。失敗するケースです。

4

8 に答える 8

4

質問とは無関係で申し訳ありませんが、別の原因により、同様のクラッシュを検索したときに Google に表示される StackOverflow の投稿はこれだけです。のクラッシュListRows.Addはかなり長い間私を悩ませていたので、それを引き起こした問題を共有しました.

ワークシートにテーブル (MySourceTable など) があります。私の UserForm では、ComboBox の RowSource はこのテーブル(MySourceTable[ColName]) の列です。同じユーザーフォームの別のボタンをクリックすると、ListRows.Addこのテーブルを使用して新しい行を挿入し、Excel をクラッシュさせていました。このシナリオがあなたのシナリオと似ている場合は、読み進めてください。

クラッシュは、まだテーブルにアタッチされている ComboBox が原因で発生しており、行の挿入を処理できません (新しい行を挿入するときにまだユーザー フォームにいるため、まだインスタンス化されていることに注意してください)。多くの苦痛の後、挿入の上と下の次の行はそれを完全に解決しました:

    comboSetSelect.RowSource = ""
    Set newRow = myTable.ListRows.Add
    comboSetSelect.RowSource = "MySourceTable[ColName]" 'col set in properties

これにより、新しい行を挿入する前に ComboBox がテーブルから切り離され、挿入が完了すると ComboBox が再び更新されます。さらに、新しく挿入された行の値 (挿入直後に更新された場合) も ComboBox に表示されます。

于 2016-11-05T20:28:09.147 に答える
3

私がやろうとしていたことは不可能のようです。

カスタム関数を開発するときは、他の VBA プロシージャから呼び出す関数と、ワークシートの数式で使用する関数との主な違いを理解することが重要です。ワークシートの数式で使用される関数プロシージャは、パッシブである必要があります。たとえば、Function プロシージャ内のコードでは、範囲を操作したり、ワークシート上の内容を変更したりすることはできません。例はこれを明確にするのに役立ちます。

セルの書式設定を変更するカスタム ワークシート関数を作成したくなるかもしれません。たとえば、カスタム関数を使用して、セルの値に基づいてセル内のテキストの色を変更する数式があると便利です。しかし、そのような関数を書くことは不可能です。何をしても、関数はワークシートを変更しません。関数は値を返すだけであることを忘れないでください。オブジェクトに対してアクションを実行することはできません。

とはいえ、注目すべき例外が 1 つあります。カスタム VBA 関数を使用して、セルコメント内のテキストを変更することができます。

Walkenbach、J.(2007)。Microsoft Office Excel 2007 Power Programming with VBA. ジョン・ワイリー&サンズ、280ページ。

于 2010-07-02T21:33:24.743 に答える
2

これは非常に古い質問であることは理解していますが、自分で答えようとして何度も出くわした質問です. なぜこれが起こっているのかの詳細はまだわかりませんが、これが私の回避策です。

Sub AddRow()
     Dim Tbl as ListObject
     Dim MyColumn as Integer

     Tbl.ListRows(1).Range.EntireRow.Insert
     Tbl.ListColumns(MyColumn).DataBodyRange.Cells(1,1).Value = "My Value"
End Sub

最初の既存のエントリの上に新しい行を追加することで、テーブルは意図したとおりに自動的に下に調整され、テーブルに値を書き始めることができます。

繰り返しますが、古い投稿を復活させて申し訳ありませんが、他の場所で適切な解決策を見つけることができなかったので、これは私自身の回避策であり、将来他の人に役立つことを願っています.

于 2016-05-23T18:07:48.850 に答える
0

私の場合、テーブルはリストボックスにバインドされていました

 Dim intClientRow As Integer
Dim strLstSource As String
strLstSource = frmHNW.lstB01People_List.RowSource
frmHNW.lstB01People_List.RowSource = ""
intClientRow = UpdateTableFromFrame(frmHNW.fraB01People, "Clients_tblClientDetails", True)
If intClientRow > 0 Then
    UpdateTableFromList frmHNW.lstB01Contact_Method, "ClientPeople_tblClientContactMethod", "=getClientID(" & intClientRow & ")"
    UpdateTableFromList frmHNW.lstB01Pref_Days, "ClientPeople_tblClientPrefDay", "=getClientID(" & intClientRow & ")"
    UpdateTableFromList frmHNW.lstB01Pref_Time, "ClientPeople_tblClientPrefTime", "=getClientID(" & intClientRow & ")"
End If

frmHNW.lstB01People_List.RowSource = strLstSource

UpdateTableFromFrame フォームは、リストボックスのソース テーブルに lisrows.add メソッドを適用します。何時間ものテストの後、リスト ソースを削除しないと listrows.add メソッドが失敗することがわかりました。そのため、UpdateTableFromFrame を呼び出す前にリストボックスの行ソースを削除し、行の追加が完了したら復元しました。これで問題は解決しました

于 2016-06-11T20:25:07.993 に答える
0

これもしばらく悩みました。私にとっては、ループで ListRows.Add を複数回呼び出すと、このエラーが発生し、Excel がクラッシュすることがあったようです。私のために働いた解決策: ListRows.Add コマンドの後に DoEvents コマンドを追加しました:

tbl.ListRows.Add
DoEvents
于 2016-09-05T11:22:34.573 に答える