人に聞けない痔の悩み、これでスッキリ >>

エクセルVBAの初心者です。

VBAを組んでいて表のデーターをリストボックスに表示しています

選択されたリストボックスの値はわかるのですが、リストボックスの上から

何行目を選択したかどうか知りたいのですが、わかる方がおられましたら

よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

こんにちは。



何行目を選択したかは、ListIndexプロパティを使います。
但し、これは、一番目が0からになりますので
実際の見た目からすると1行少ない値が返ります。
で、1を加えて、ListIndex+1 が見た目の行になります。
 
Msgbox ListBox1.ListIndex + 1 & " 行目を選択しました"

以上です。
    • good
    • 0
この回答へのお礼

Msgbox ListBox1.ListIndex + 1 & " 行目を選択しました" を

実行したところうまく実行できました。有難うございました

今後もよろしくお願いします

お礼日時:2007/01/23 13:25

★追記。


・調べたら『ByVal』は必要ないようですね。ごめんなさい。

Public ListIndex As Long
Const LB_GETCURSEL = &H188

'選択項目番号の取得
ListIndex = SendMessage( Listbox.hWnd, LB_GETCURSEL, 0, 0 )

参考URL:http://forums.belution.com/ja/vb/000/005/65s.shtml
    • good
    • 0
この回答へのお礼

ListIndexをEXCELVBAで使ったらうまく処理できました。

有難うございました。それにしてもC言語は難しいそうですね

お礼日時:2007/01/23 13:28

★初心者さんですか?


・………。
・私は C/C++ 言語ですが、リストボックスの現在選択している位置は
 リストボックス専用の LB_GETCURSEL メッセージで取得できます。
・次の1行で取得できますけど、あまり Visual Basic には詳しくないです。
・『SendMessage( Listbox.hWnd, LB_GETCURSEL, 0&, ByVal 0& )』この
 関数の戻り値に選択位置が 0~??? の通し番号で返されます。
・わかりますか?
・『Listbox.hWnd』がリストボックスのウインドウ・ハンドルですよ。
・以上。おわり。

参考URL:http://hanatyan.sakura.ne.jp/vbdengon/log_1051to …
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qexcelのリストボックスで選択した項目をアクティブセルに入力方法

もしかしたら既出かもしれませんが・・・
フォームコントロールのリストボックスで入力範囲の指定したリストをリンクするセルをワークシート上にクリックしたセルに入力させる方法はありますか?
もし、不可能でしたら、ActiveXコントロールのリストボックスでも構いません。よろしくお願いいたします。

Aベストアンサー

そのリストボックスの、コードの表示で
Private Sub ListBox1_Click()
ActiveCell = ListBox1.List(ListBox1.ListIndex)
End Sub
と入れるだけ。
コントロールツールボックスのコントロールを、ワークシートに直接
貼り付けた場合。
WEBや解説書で、ListboxとかListindexなど調べましたか。

QエクセルVBA リストボックス、選択した数値の取得

エクセルVBA ユーザーフォームのリストボックスより選択した数値の取得についてアドバイス願います。

ユーザーフォームのリストボックスに表示させている中から、(列数は5列表示させています)選択行の内より(後ろの)4列から数値を取得し、足し算を行い、テキストボックスに表示したいのですが、構文エラーが出ます。アドバイスをお願います。

Dim 選択行 As Integer
選択行 = Userform1.ListBox1.ListIndex

With Userform1.ListBox1
TextBox1 = .List(選択行, 1) + ListBox1.List(選択行, 2) + ListBox1.List(選択行, 3) + ListBox1.List(選択行0, 4)
End With

Aベストアンサー

画像があると早いのですが、
>(列数は5列表示させています)
ということは、カラムが5列ですか?

>選択行 = Userform1.ListBox1.ListIndex
これで、選択行が取れなかったように思いますが……。

Private Sub CommandButton1_Click()
 Dim i As Long
 Dim j As Long
 Dim Total As Long
 j = 1 '1列目は読まない
 With ListBox1
  For i = 0 To .ListCount - 1
   If .Selected(i) Then
    Do
     Total = Total + .List(i, j)
     j = j + 1
    Loop Until j > .ColumnCount - 1
    Exit For 'Singleセレクトの場合
   End If
  Next i
 If Total <> 0 Then
  TextBox1.Text = Format$(Total, "#,##0")
 End If
 .Selected(i) = False '選択の反転はここで消える
 End With
End Sub

画像があると早いのですが、
>(列数は5列表示させています)
ということは、カラムが5列ですか?

>選択行 = Userform1.ListBox1.ListIndex
これで、選択行が取れなかったように思いますが……。

Private Sub CommandButton1_Click()
 Dim i As Long
 Dim j As Long
 Dim Total As Long
 j = 1 '1列目は読まない
 With ListBox1
  For i = 0 To .ListCount - 1
   If .Selected(i) Then
    Do
     Total = Total + .List(i, j)
     j = j + 1
    Loop Until j > .ColumnCount - 1...続きを読む

Qエクセル リストボックスにセルの値を表示したい

Sheet1に
A1 a
A2 i
A3 u
と入力されています。

フォームのリストボックスにこの3つのセルを表示したいのですが
Private Sub UserForm_Initialize()
UserForm1.ListBox1.ControlSource = Sheets("Sheet1").Range(Cells(1, 1), Cells(1, 3))
End Sub
ではうまく行きません。

デバッグしてもなにも引っかからないのですが
実行すると
「実行時エラー13
型が一致しません」
となります。

「ControlSource」を「RowSource」に変えても同じでした。
※列が移動するため列番号を変数で取得したいのでCellsを使用しています。

ご教授よろしくお願いします。

Aベストアンサー

回答4、onlyromです。
大事なことを言い忘れ。。

ROWSOURCEプロパティを使うときは、リストに使う値がアクティブシートにない場合は、シート名を付けないとエラーになります。
ということで改めて回答です。


R = 5

UserForm1.ListBox1.RowSource = "Sheet1!A1:A" & R

UserForm1.ListBox1.RowSource = "Sheet1!" & Range(Cells(1, 1), Cells(R, 1)).Address

UserForm1.ListBox1.List = Sheets("Sheet1").Range("A1:A" & R).Value

UserForm1.ListBox1.List = Sheets("Sheet1").Range(Cells(1, 1), Cells(R, 1)).Value
 
このどれかを使えますが、セルの値を使うときは、Listプロパティをお勧めします。
 

Qエクセル VBA ユーザーフォームを閉じる

ユーザーフォームを開く時は
UserForm1.Showですが
閉じる時は?
UserForm1.Close
だとコンパイルエラーになります。
End
にするしかないですか?

Aベストアンサー

Unload Me とか Unload UserForm1 でユーザーフォームを閉じることができます。

QExcelVBA でリストリストボックスに列見出しをコーディングでつける

エクセルVBAのフォームにリストボックスを作り、データーベースから読み出したデータを表示させています。

この時、各列にテーブル名とはちがう列名をつけたいのですが、シートに記述するのではなく、コーディングでつける事は出来ませんか?

ControlTipTextに「test1;test;test3;」と指定してみたりしましたが、駄目でした。

どなたかご教授、あるいは出来ません、シートに隠しか方法はありません、と全否定をしてください。

Aベストアンサー

Wendy02 です。配列で入れる方法を考えてみましたが、できませんでした。

結局、他の方法としては、ListBox の 上に、白のLabel をそれぞれのColumnにあわせて、表示するぐらいしか、思いつきません。(これは、論外でしょうね)

列見出し(フィールド)は、もともと、Excelのワークシートの、データベース用の仕様のひとつだから、Rangeオブジェクトでしか、ListBox の Header に入れることは、出来ないようです。

Qユーザーフォームを表示中にシートの操作をさせるには

ユーザーフォームを表示中にシートの操作をさせる事はできるのでしょうか。
セルへの入力、画面のスクロールなどは、ユーザーフォームからマクロを実行させたり、.hideでユーザーフォームを一時的に隠すなどすればいいのでしょうが、そういう手段をとらないでユーザーフォームを表示中にシートの操作をさせる事はできるのでしょうか。

Aベストアンサー

ユーザフォームの
ShowModalプロパティを
falseにすればよいかと。

QEXCEL VBAで計算値を四捨五入、切り上げ、切捨てする方法

ネットで探してみたのですが、計算結果を四捨五入して特定のセルを
返すにはどうしたらいいのでしょうか?

Sub hokangosa()

Dim ZPS As Double
Dim ZPOS As Double
Dim DMN As Double
MsgBox (" >>> 補間誤差自動計算 <<< ")
MsgBox (" >>> 初期値入力します <<< ")
ZPS = InputBox(">>> ステップを入力してください<<<")
ZPOS = Sheet1.Cells(22, 4).Value
DMN = ZPOS / ZPS
Sheet1.Cells(23, 6).Value = DMN
End Sub

ここでDMNの値を四捨五入したいです。

またこれとは別に切上げ、切捨ても教えていただけるとありがたいです。

Aベストアンサー

DMN = Application.WorksheetFunction.Round(ZPOS / ZPS, 0)
で、四捨五入
DMN = Application.RoundDown(ZPOS / ZPS, 0)
で切り捨て
DMN = Application.RoundUp(ZPOS / ZPS, 0)
で切り上げです。

引数で、対象桁を変更できます。

QVBA エンターキーでイベントに入りたい。

テキストボックスにデータ入力後エンターキーの押下でイベントに入りたいのですが、下記のコーディングで[通過]メッセージが表示されません。英数字は通過しますが、エンターキーは動作停止します。
これと全く同じコーディングでVB6は正しく動きます。(ただし、Pvate Sub text1_KeyPress(KeyAscii As Integer)に変更してます。)
<コーディング>
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
Msgbox "通過"
If KeyAscii = vbKeyReturn Then
KeyAscii = 0
End If
End Sub

これが出来ると、そのつどキーボードから手を離さずに済むので作業効率がグンとあがります。どうかよろしくご教示ください。Excel2003SP3

Aベストアンサー

こんにちは。

>ご指摘のオブジェクトとプロシージャは間違いないことを確認しています。(TextBox1,keyPress)コードのロジックはこれ以上簡単に書きようがないほど単純明快です。

>Excelで実際にこのコードを実行していただけませんか。

ご自身のコードが間違いがないと思い込んでいられるから、そういう発言をされるのだと思いますが、ここでのお話の前提は、あくまでも、VBAです。VB6ではありません。

私が、期待通りの反応を示さないので、「実際にこのコードを実行してください」とおっしゃっているようですが、はっきり言えば、その最初のコードは、VBAでは間違っています。それに気がついてください。

質問のコードのままのコードでは、Enter キーのイベントは、取れないのです。別にPCの故障でもソフトの問題でもないし、こちらが試していないわけでもありません。

Visual Basic とVBAは、細かい点で違います。

VBAのこの種のイベントの KeyAscii では、VB6 で取れる、EnterキーのKeyAsciiの 「13」 は、取れません。 KeyAscii は、MSForms.ReturnIntegerとなって、Integer ではありません。

だから、私は、その代わりとして、KeyDown イベントを使えばよいとしているわけなのです。

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
 If KeyCode = vbKeyReturn Then
  MsgBox "Enterキーが入りました", 64
  'KeyCode =0
 End If
End Sub

Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
 MsgBox "通過"
End Sub

こんにちは。

>ご指摘のオブジェクトとプロシージャは間違いないことを確認しています。(TextBox1,keyPress)コードのロジックはこれ以上簡単に書きようがないほど単純明快です。

>Excelで実際にこのコードを実行していただけませんか。

ご自身のコードが間違いがないと思い込んでいられるから、そういう発言をされるのだと思いますが、ここでのお話の前提は、あくまでも、VBAです。VB6ではありません。

私が、期待通りの反応を示さないので、「実際にこのコードを実行してください」とおっしゃってい...続きを読む

QVBAでシートからコンボボックスにデータを設定する方法

VBAにてフォーム起動時にシート内に設定した
値をコンボボックスに取り込みたいのですが・・。
たとえばA列に連続で入力されているデータを
取り込むなど・・。
設定データ数は動的に変化します。

Aベストアンサー

もうほとんど同じですが…

Private Sub UserForm_Initialize()
Dim i As Integer

 ComboBox1.Clear
 For i = 1 To Worksheets("sheet1").Cells(Rows.Count, 1).End(xlUp).Row
  ComboBox1.AddItem Worksheets("sheet1").Cells(i, 1).Value
 Next
End Sub

Q[初心者です]VBAで指定列からAを検索し、発見したら隣のセルに値0を入れるマクロ。

VBAで指定列からAを検索し、発見したら隣のセルに0を入れるマクロを組みたいのですが、組み方がVBA初心者の為わかりません。
(例)
L列に、A、B、C、D、E、Fとランダムに文字が入っていて、
文字Aを検索し、発見したら隣のI列に値0を入れるというマクロです。

Sub Search()
Dim A As String
Set A = Worksheets("Sheet1").Cells.Find("A")
If A Is Nothing Then
ActiveCell.Offset(0, 1).Value = 0

End If
End Sub
と過去の質問で考えてみたのですが、Aがあった時、、、、
とコードが書けないです。
大変困っているので、ご教授頂けないでしょうか?
出来れば、そのままマクロに出来るコードを教えて頂けないでしょうか?
宜しくお願い致します。

Aベストアンサー

こんばんは。

#3さんのおっしゃっていることも、もっともなのですが、気になる点がありましたので、自分のことを踏まえて、書かせていただきます。

いずれ、また、同じようなケースが出会うと思います。こんな原則を考えてみたらどうでしょうか?それは、私も自身も同じなのですが、ワークシートのコマンドで行われるものは、記録マクロから作ってみるということです。他にも、「統合」とか、「置換」とか「オートフィルタ」「フィルタオプション」とかは、みんなパターンが決まっています。
その中の代表格が、この「Find」 です。

>Set A = Worksheets("Sheet1").Cells.Find("A")

>過去の質問で考えてみたのです

どうも、Find メソッドは、あるレベル以下の人は、省略する傾向があるようです。何が大事で、何が大事でないかというのは、やってみなければ分かりませんが、検索語だけを入れる書き方は、実務では、あまりしないほうがよいと思います。

だいたい、以下のTestFind2 ぐらいまでに、省略は、とどめたほうがよいです。

それは、Find は、必ずしも自分が思っているデフォルトとは違うことがあるので、「明示的(意図的に)」にオプションは入れたほうがよいです。
例えば、大文字小文字の違いを付けるなら、MatchCase:=True, 数式まで探すなら、LookIn:=xlFormulas

なお、Find メソッドは、5年経っても、たぶん完全に覚えられません。面倒なコードのひとつです。ですが、これはパターンが決まっているので、ひとつパターンが決まったら、それに当てはめればよいだけです。

#3さんで示されているMougのサンプルコードと似てはいるのですが、Mougのサンプルコードでは、Verionによって、失敗することがあります。

'--------------------------------------
'記録マクロをそのまま使う方法
Sub TestFind1()
Dim c As Range
 Set c = Columns("L:L").Find(What:="A", _
           After:=ActiveCell, _
           LookIn:=xlValues, _
           LookAt:=xlPart, _
           SearchOrder:=xlByRows, _
           SearchDirection:=xlNext, _
           MatchCase:=False, _
           MatchByte:=False, _
           SearchFormat:=False)
 c.Offset(0, 1).Value = 0
End Sub
'--------------------------------------
'TestFind1 をアレンジしてみる
Sub TestFind2()
Dim c As Range
'検索語
Const MYTXT As String = "A"
 Set c = ActiveSheet.Columns("L:L").Find(What:=MYTXT, _
           LookIn:=xlValues, _
           LookAt:=xlPart, _
           MatchCase:=False)
 If Not c Is Nothing Then
    c.Offset(0, 1).Value = 0
 End If
End Sub

'---------------------------------------
'複数ある場合(パターンを使った方法)
'---------------------------------------
Sub TestFind3()
  Dim c As Range
  Dim FirstAdd As String
  Const MYTXT As String = "A"
  Set c = ActiveSheet.Columns("L:L").Find( _
    What:=MYTXT, _
    LookIn:=xlValues, _
    LookAt:=xlPart, _
    MatchCase:=False)
  
  If Not c Is Nothing Then
    FirstAdd = c.Address
    Do
      c.Offset(, 1).Value = 0
      Set c = ActiveSheet.Columns("L:L").FindNext(c)
      If c.Address = FirstAdd Then Exit Sub
    Loop Until c Is Nothing
  End If
End Sub

こんばんは。

#3さんのおっしゃっていることも、もっともなのですが、気になる点がありましたので、自分のことを踏まえて、書かせていただきます。

いずれ、また、同じようなケースが出会うと思います。こんな原則を考えてみたらどうでしょうか?それは、私も自身も同じなのですが、ワークシートのコマンドで行われるものは、記録マクロから作ってみるということです。他にも、「統合」とか、「置換」とか「オートフィルタ」「フィルタオプション」とかは、みんなパターンが決まっています。
その中の代表...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング