Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : Excel 2013)
424エラーの回避方法
投稿日時: 21/04/21 10:13:18
投稿者: hinayou1721

はじめて投稿する初心者です。
わかりにくかったらすいません。
 
<やりたいことの概要>
エクセルのワークシートに”契約一覧”というシートがあり、その中から条件に一致するレコードをリストボックスに表示させて、それをダブルクリックすると、別の入力用のフォームを開いてシートの情報を、そのフォームのテキストボックスに転記するコードを書いています。
 
<使用するコントロール類の名前>
検索用のフォーム名 = kensaku
転記用のフォーム名 = sekou
転記用のフォーム内のテキストボックス名 = yosan
 
です。
 
Private Sub hyoji_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Dim rows As String, i As Integer
 
  With Me!hyoji 'リストボックス名
    For i = 0 To .ListCount - 1 'リストボックスの行数
      If .Selected(i) Then '選択されていた場合
        If rows = "" Then
          rows = i + 3 '1個目のとき
        Else
          rows = rows & ", " & i + 3 '複数あるとき
        End If
      End If
    Next i
  End With
  
  sekou.Show ’転記したいフォームを開く
   
     
   Set sekou.yosan.Value = Worksheets("契約一覧").Cells(rows, 2).Value ← ここで424エラー
 
End Sub
 
オブジェクトの指定の仕方がわからず、苦慮しています。
 
初歩的なことがわかっていないようで大変恐縮なのですが、
よろしくお願いいたします。

回答
投稿日時: 21/04/21 13:24:43
投稿者: QooApp

 Set sekou.yosan.Value = Worksheets("契約一覧").Cells(rows, 2).Value ← ここで424エラー
 
これって、.valueに入れようとしてるからset不要ではないでしょうか

回答
投稿日時: 21/04/21 13:42:03
投稿者: sk

引用:
エクセルのワークシートに”契約一覧”というシートがあり、
その中から条件に一致するレコードをリストボックスに表示させて、
それをダブルクリックすると、別の入力用のフォームを開いて
シートの情報を、そのフォームのテキストボックスに転記するコードを書いています。

引用:
With Me!hyoji 'リストボックス名
  For i = 0 To .ListCount - 1 'リストボックスの行数
    If .Selected(i) Then '選択されていた場合
      If rows = "" Then
        rows = i + 3 '1個目のとき
      Else
        rows = rows & ", " & i + 3 '複数あるとき
      End If
    End If
  Next i
End With

リストボックス[hyoji]の MultiSelect プロパティの設定値は何でしょうか。
 
引用:
Set sekou.yosan.Value = Worksheets("契約一覧").Cells(rows, 2).Value

・テキストボックスの Value プロパティに対して
 Set ステートメントによって参照渡しを行うことは出来ない。
 (単一のセルの値を代入するだけなら Set は不要)
 
・Cells プロパティの第 1 引数 RowIndex に対して
 カンマで区切られた数字のリスト(文字列式)を渡したからといって、
 複数の行のセルへの参照が返されるわけではない。
 (例えば変数 rows の値が "1,3" という文字列である場合、
 上記のコードによって Cells プロパティが返すのは
 「 B1 セルと B3 セル」ではなく「 B13 セル」への参照である)

回答
投稿日時: 21/04/21 15:28:16
投稿者: WinArrow
投稿者のウェブサイトに移動

リストボックスのダブルクリックイベントは、有効な行は、選択した行(1行)のみですよね?
ループして全行を検査する必要ははないと思いますが・・・
 
 > sekou.Show ’転記したいフォームを開く
の後に
>Set sekou.yosan.Value = Worksheets("契約一覧").Cells(rows, 2).Value
 
setは不要ですが、
テキストボックスにセルの値を代入する
コードがあります。
このコードは、実行されませんよ。(Setを除いたとしても)
    
 

投稿日時: 21/04/21 16:43:55
投稿者: hinayou1721

皆様ありがとうございます。
まとめてのお礼になってしまい申し訳ありません。
 
sk様
0-fmMulti〜になっています。
 
初めは、Setをつけずに、
sekou.yosan.Value = Worksheets("契約一覧").Cells(rows, 2).Value
という記述をしていたのですが、同エラーが発生していたので、調べた結果、
Setをつけるに至ったのですが、それでもだめで苦慮していました。
 
検証をしていますので、また不明な点が出てきたらご教示ください。
ひとまず皆様ありがとうございます。
 
結果をまたあげますので、それまでいったん失礼します。

回答
投稿日時: 21/04/21 16:45:10
投稿者: WinArrow
投稿者のウェブサイトに移動

実験結果報告
  
リストボックスをMultiSelectを設定して、
ダブルクリックしたところ、選択した行の一番下の行しか有効になりません。
つまり、1行のみ有効ということになります。
  
ここで取得した Rows(文字列)をセルの行に使っていますが、
例えば、仮に、リストボックスの1行目と2行目が選択されていると仮定した場合、
Rowsは、「3,4」となります。
これをそのまま、セルの行に適用すると
Cells($B$34)となります。
  
なんとなく納得していませんが、sk さんとかぶってしまいました。
  
  
  
>sekou.yosan.Value = Worksheets("契約一覧").Cells(rows, 2).Value
は、sekou.Show
の前に記述すれば、実行されます。(424エラーが出なくなるでしょう)

投稿日時: 21/04/21 17:15:53
投稿者: hinayou1721

WinArrow様をはじめ皆様方ありがとうございました。
 
対象フォームを開くまえに値を取得しておいて、フォームを開くなんて
考えもしませんでした。
無事解決しそうです。
 
本当にありがとうございました。[/quote]