Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


2544 / 13646 ツリー ←次へ | 前へ→

【67311】List Viewについて まい 10/11/23(火) 14:24 質問[未読]
【67312】Re:List Viewについて まい 10/11/23(火) 15:26 質問[未読]
【67315】Re:List Viewについて neptune 10/11/23(火) 21:30 回答[未読]
【67329】Re:List Viewについて まい 10/11/25(木) 13:05 質問[未読]
【67334】Re:List Viewについて neptune 10/11/25(木) 19:12 発言[未読]
【67343】Re:List Viewについて まい 10/11/26(金) 14:33 発言[未読]
【67346】Re:List Viewについて neptune 10/11/26(金) 18:19 発言[未読]
【67373】Re:List Viewについて まい 10/11/29(月) 10:18 お礼[未読]
【67341】Re:List Viewについて Jaka 10/11/26(金) 9:23 発言[未読]
【67344】Re:List Viewについて まい 10/11/26(金) 14:54 質問[未読]
【67345】Re:List Viewについて Jaka 10/11/26(金) 16:48 発言[未読]
【67374】Re:List Viewについて まい 10/11/29(月) 10:21 お礼[未読]

【67311】List Viewについて
質問  まい  - 10/11/23(火) 14:24 -

引用なし
パスワード
   今、Listviewを使って、マクロを作成しています

LISTシートのデータをListViewに表示させるようにして、
チェックボックスもつけてあります

やりたい事がうまくできず困っています

ユーザーフォームに
textBox1 (任意の日付)
CommandButton1 (更新ボタン)
ListView1
が存在します

【やりたいこと】
日付入力したい行のチェックボックスにチェックをつけます
そのときチェックは複数つきます

次に、ユーザーフォーム上にあるtextBox1に日付を入力
CommandButton1をクリックすると、チェックした行すべてに日付が入力され、
ListViewに表示される

といった、マクロを作りたいのですが、うまくいきません

今は下記のように記述してあります

Private Sub UserForm_Initialize()
With ListView1
    .View = lvwReport      ''表示
    .LabelEdit = lvwManual   ''ラベルの編集
    .HideSelection = False   ''選択の自動解除
    .AllowColumnReorder = True ''列幅の変更を許可
    .FullRowSelect = True    ''行全体を選択
     ListView1.CheckBoxes = True ''チェックボックス設定
    .Gridlines = True      ''グリッド線

    .ColumnHeaders.Add 1, "_PN", "なまえ"
    .ColumnHeaders.Add 2, "_CODE", "こーど"
    .ColumnHeaders.Add 3, "_DATE", "日付"

  End With
  
   For i = 4 To Range("A" & Rows.Count).End(xlUp).Row
  With ListView1
   With .ListItems.Add
      .Text = Range("A" & i).Value
      .SubItems(1) = Range("F" & i).Value
      .SubItems(2) = Range("G" & i).Value
   End With
  End With
  Next i

end Sub

Private Sub CommandButton1_Click()
 Dim i As Integer
  Dim MyItem As String

  MyItem = ""

'とりあえず、テストでチェックしたアイテムが順番に取得できるか?
テストしてみました。でも、下記の記述では一番目のアイテムは取得できるけど、
2個目からは取得できてませんでした

’実際には、ココで、テキストボックスに入れた日付をListシートにも反映させて、ListViewに結果を表示させたいと思っています

  With ListView1
    For i = 1 To .ListItems.Count
      If .ListItems(i).Selected Then
        MyItem = MyItem + .ListItems(i).Text + vbCrLf
      End If
    Next i
  End With

  MsgBox MyItem

End Sub

どうか、よきアドバイスをお願いいたします

【67312】Re:List Viewについて
質問  まい  - 10/11/23(火) 15:26 -

引用なし
パスワード
   一部、間違って解釈していた箇所があったので、再度投稿します


>今、Listviewを使って、マクロを作成しています
>
>LISTシートのデータをListViewに表示させるようにして、
>チェックボックスもつけてあります
>
>やりたい事がうまくできず困っています
>
>ユーザーフォームに
>textBox1 (任意の日付)
>CommandButton1 (更新ボタン)
>ListView1
>が存在します
>
>【やりたいこと】
>日付入力したい行のチェックボックスにチェックをつけます
>そのときチェックは複数つきます
>
>次に、ユーザーフォーム上にあるtextBox1に日付を入力
>CommandButton1をクリックすると、チェックした行すべてに日付が入力され、
>ListViewに表示される
>
>といった、マクロを作りたいのですが、うまくいきません
>
>今は下記のように記述してあります
>
>Private Sub UserForm_Initialize()
>With ListView1
>    .View = lvwReport      ''表示
>    .LabelEdit = lvwManual   ''ラベルの編集
>    .HideSelection = False   ''選択の自動解除
>    .AllowColumnReorder = True ''列幅の変更を許可
>    .FullRowSelect = True    ''行全体を選択
>     ListView1.CheckBoxes = True ''チェックボックス設定
>    .Gridlines = True      ''グリッド線
>
>    .ColumnHeaders.Add 1, "_PN", "なまえ"
>    .ColumnHeaders.Add 2, "_CODE", "こーど"
>    .ColumnHeaders.Add 3, "_DATE", "日付"
>
>  End With
>  
>   For i = 4 To Range("A" & Rows.Count).End(xlUp).Row
>  With ListView1
>   With .ListItems.Add
>      .Text = Range("A" & i).Value
>      .SubItems(1) = Range("F" & i).Value
>      .SubItems(2) = Range("G" & i).Value
>   End With
>  End With
>  Next i
>
>end Sub
>
>Private Sub CommandButton1_Click()
> Dim i As Integer
>  Dim MyItem As String
>
>  MyItem = ""
>
>'とりあえず、テストでチェックしたアイテムが順番に取得できるか?
>テストしてみました。でも、下記の記述では一番目のアイテムは取得できるけど、
>2個目からは取得できてませんでした

↑チェックボックスを取得していませんでした、
 勘違いでした
 行を選択したところを取得していました
 チェックボックスのチェックした箇所の取得がうまくいきません・・・
 CheckedItems というものを使うところまでは分かったのですが、それでも、うまくいかないです
 
>
>’実際には、ココで、テキストボックスに入れた日付をListシートにも反映させて、ListViewに結果を表示させたいと思っています
>
>  With ListView1
>    For i = 1 To .ListItems.Count
>      If .ListItems(i).Selected Then
>        MyItem = MyItem + .ListItems(i).Text + vbCrLf
>      End If
>    Next i
>  End With
>
>  MsgBox MyItem
>
>End Sub
>
>どうか、よきアドバイスをお願いいたします

【67315】Re:List Viewについて
回答  neptune  - 10/11/23(火) 21:30 -

引用なし
パスワード
   ▼まい さん:
>'とりあえず、テストでチェックしたアイテムが順番に取得できるか?
>テストしてみました。でも、下記の記述では一番目のアイテムは取得できるけど、
>2個目からは取得できてませんでした
checkboxを使用している時はCheckedプロパティで判断します。

>’実際には、ココで、テキストボックスに入れた日付をListシートにも反映させて、ListViewに結果を表示させたいと思っています
>
>  With ListView1
>    For i = 1 To .ListItems.Count
>      If .ListItems(i).Selected Then
       If .ListItems(i).Checked Then
>        MyItem = MyItem + .ListItems(i).Text + vbCrLf
>      End If
>    Next i
>  End With
>
>  MsgBox MyItem
>
>End Sub

【67329】Re:List Viewについて
質問  まい  - 10/11/25(木) 13:05 -

引用なし
パスワード
   ▼neptune さん:

ありがとうございました
checkedでうまく取得できるようになりました・・・が、
下記のことが、うまくできなくて困っています。
何か、アドバイスをいただけると幸いです ↓
>
>>’実際には、ココで、テキストボックスに入れた日付をListシートにも反映させて、ListViewに結果を表示させたいと思っています
>>
>>  With ListView1
>>    For i = 1 To .ListItems.Count
>>      If .ListItems(i).Selected Then
>       If .ListItems(i).Checked Then
>>        MyItem = MyItem + .ListItems(i).Text + vbCrLf
>>      End If
>>    Next i
>>  End With
>>
>>  MsgBox MyItem
>>
>>End Sub

【67334】Re:List Viewについて
発言  neptune  - 10/11/25(木) 19:12 -

引用なし
パスワード
   ▼まい さん:
先に書いておきますが、
私はマルッとソース書くのは面倒なんでお断りしているんですが。

>下記のことが、うまくできなくて困っています。
>何か、アドバイスをいただけると幸いです ↓
これの事?
>’実際には、ココで、テキストボックスに入れた日付をListシートにも反映させて、ListViewに結果を表示させたいと思っています
何がわからんのでしょう?
質問なら受け付けます。

質問のソース書けるスキルがあるならどうってことないと思うんですが??
listviewにデータの追加も取得も出来てるし。。。。

あっもう一つ、もし、listviewを使ったbookの配布を考えているなら
それはライセンス違反の可能性大です。

【67341】Re:List Viewについて
発言  Jaka  - 10/11/26(金) 9:23 -

引用なし
パスワード
     With ListView1
    For i = 1 To .ListItems.Count
      'If .ListItems(i).Selected Then
       If .ListItems(i).Checked Then
        MyItem = MyItem & .ListItems(i).Text & " : " & _
             .ListItems(i).ListSubItems(2).Text & vbLf
        .ListItems(i).ListSubItems(2).Text = TextBox1.Value
        Cells(i, 4).Value = TextBox1.Value
       End If
      'End If
    Next i
  End With

  MsgBox Left(MyItem, Len(MyItem) - 1)


>   For i = 4 To Range("A" & Rows.Count).End(xlUp).Row
>  With ListView1
>   With .ListItems.Add
>      .Text = Range("A" & i).Value
>      .SubItems(1) = Range("F" & i).Value
>      .SubItems(2) = Range("G" & i).Value
>   End With
>  End With
>  Next i
       ↓
  With ListView1
    For i = 4 To Range("A" & Rows.Count).End(xlUp).Row
      With .ListItems.Add
        .Text = Range("A" & i).Value
        .SubItems(1) = Range("F" & i).Value
        .SubItems(2) = Range("G" & i).Value
      End With
    Next
  End With

【67343】Re:List Viewについて
発言  まい  - 10/11/26(金) 14:33 -

引用なし
パスワード
   ▼neptune さん:
>▼まい さん:
>先に書いておきますが、
>私はマルッとソース書くのは面倒なんでお断りしているんですが。

おっしゃるとおりです
すみません・・・
丸投げみたいな投稿になってました
もう少し、考えてみます

あと、下記のライセンス違反という内容がありましたが、
これは、Listviewを使って作成したマクロの入ったファイルを、
共有ファイルにして、複数の人が使うということも、ライセンス違反可能性大になるということでしょうか?

その辺教えていただけるとありがたいです


>
>あっもう一つ、もし、listviewを使ったbookの配布を考えているなら
>それはライセンス違反の可能性大です。

【67344】Re:List Viewについて
質問  まい  - 10/11/26(金) 14:54 -

引用なし
パスワード
   ▼Jaka さん:

アドバイスありがとうございました
listviewにテキストボックスの値を入替えることができました
一つききたいのですが、
リストに反映させる場合は、やはり、一から対称アイテムの行を検索して、
値を入力させるといった形になるのでしょうか?
そういうやり方しかないのでしょうか?
毎回、チェックしたアイテムを一つ一つ探しにいって、値を代入させるのは、時間もかかりそうで・・・

>  With ListView1
>    For i = 1 To .ListItems.Count
>      'If .ListItems(i).Selected Then
>       If .ListItems(i).Checked Then
>        MyItem = MyItem & .ListItems(i).Text & " : " & _
>             .ListItems(i).ListSubItems(2).Text & vbLf
>        .ListItems(i).ListSubItems(2).Text = TextBox1.Value
>        Cells(i, 4).Value = TextBox1.Value
  '↓このような形で対象アイテムの行を探しています
         For q = 4 to Range("A"& Rows.Count).End(xlup).Row)
           If .ListItems(i).Text=Cells(q,"A").Value Then
            Cells(q,"G").Value=.ListItems(i).Text
            Exit for
           End If
         Next q  

>       End If
>      'End If
>    Next i
>  End With
>
>  MsgBox Left(MyItem, Len(MyItem) - 1)
>
>
>>   For i = 4 To Range("A" & Rows.Count).End(xlUp).Row
>>  With ListView1
>>   With .ListItems.Add
>>      .Text = Range("A" & i).Value
>>      .SubItems(1) = Range("F" & i).Value
>>      .SubItems(2) = Range("G" & i).Value
>>   End With
>>  End With
>>  Next i
>       ↓
>  With ListView1
>    For i = 4 To Range("A" & Rows.Count).End(xlUp).Row
>      With .ListItems.Add
>        .Text = Range("A" & i).Value
>        .SubItems(1) = Range("F" & i).Value
>        .SubItems(2) = Range("G" & i).Value
>      End With
>    Next
>  End With

【67345】Re:List Viewについて
発言  Jaka  - 10/11/26(金) 16:48 -

引用なし
パスワード
   ▼まい さん:
>一つききたいのですが、
>リストに反映させる場合は、やはり、一から対称アイテムの行を検索して、
>値を入力させるといった形になるのでしょうか?
>そういうやり方しかないのでしょうか?
>毎回、チェックしたアイテムを一つ一つ探しにいって、値を代入させるのは、時間もかかりそうで・・・

その方がいいですよ。
たいした時間でもないと思うし。

無理やりなら、配列に入れておくとか。
ただ、これだと配列のクリアのタイミングとか、チェックを外した時とか、
色々考えないとならないから、私ならやりません。
あ、都度配列を拡張しないで、あらかじめリストアイテム分の配列を作っておけば、
配列のインデックスとリストインデックスが一致するから?(+1が必要かも)
それなりに出来るでしょうが、やっぱりやりません。

Dim ItemTb() As Long, Tbub As Long

Private Sub ListView1_ItemCheck(ByVal Item As MSComctlLib.ListItem)
On Error Resume Next
Tbub = UBound(ItemTb)
If Err Then
  Tbub = 1
End If
ReDim Preserve ItemTb(1 To Tbub)
ItemTb(Tbub) = Item.Index
'MsgBox Item.Index
End Sub

【67346】Re:List Viewについて
発言  neptune  - 10/11/26(金) 18:19 -

引用なし
パスワード
   ▼まい さん:
///////////////listviewのライセンスについて///////////////
listviewはMscomctl.ocxを使用しますが、Mscomctl.ocxは開発用ツール(vb6)
とかoffice用のソフト開発する為のツールに付属します。
これらのツール(開発環境)は開発ライセンスを持ち、そのライセンスを持つ者のみ
が、再頒布可能なコントロールが付属してきます。Mscomctl.ocxもその1つです。

従って、開発ライセンスを持たない者は配布することは出来ません。

現在使用できているのはお使いのPC若しくはソフトウェアに付属しているもので、本来は
使用して開発してはいけない可能性もあると思います。
この辺りは・・・使用ライセンスってのもあってややこしいので良くわかりません。

なので、自分で使用するマクロを自分で作って使うのはグレーゾーンで良いとして
(ここまではMSも言わないと思うから)、本来は開発に開発ライセンスが必要なActive X
を使用して開発、それを第三者に配布ってのは明らかにライセンス違反と思います。

但し、APIでゴリゴリ書いてlistviewを使用するのはActive Xを使用しないから問題ありません。
VBAでは非現実的とは思いますけど。。。

古いものですが、現在も有効なはずです。
[MOD] Office 2000 Developer に添付されている ActiveX コントロール
ht tp://support.microsoft.com/kb/413938/ja


///////////////本題///////////////
前置きが長くて済みません。
で、以下ですけど
>共有ファイルにして、複数の人が使うということも、ライセンス違反可能性大になるということでしょうか?
感覚的にはかなり濃いグレー色か黒って気がしますが、確実には判断しかねます。
作成者以外が使用しますからねぇ。
正直、本当の所はMSに問い合わせなければ判らんと思います。

【67373】Re:List Viewについて
お礼  まい  - 10/11/29(月) 10:18 -

引用なし
パスワード
   ▼neptune さん:
ご返答ありがとうございます

やはり、ListViewはあまり使用しないほうがいいんですね

ライセンスの話になると、難しくていまいち理解ができないところも多々ありますが、もう少し、他でいい方法がないか?
考えてみたいと思います

ありがとうございました

【67374】Re:List Viewについて
お礼  まい  - 10/11/29(月) 10:21 -

引用なし
パスワード
   ▼Jaka さん:

アドバイスありがとうございます
やっぱり、地道にアイテム行を検索しつつ反映させる方法でいこうと
思っています

いろいろと教えていただいてありがとうございました
助かりました


>▼まい さん:
>>一つききたいのですが、
>>リストに反映させる場合は、やはり、一から対称アイテムの行を検索して、
>>値を入力させるといった形になるのでしょうか?
>>そういうやり方しかないのでしょうか?
>>毎回、チェックしたアイテムを一つ一つ探しにいって、値を代入させるのは、時間もかかりそうで・・・
>
>その方がいいですよ。
>たいした時間でもないと思うし。
>
>無理やりなら、配列に入れておくとか。
>ただ、これだと配列のクリアのタイミングとか、チェックを外した時とか、
>色々考えないとならないから、私ならやりません。
>あ、都度配列を拡張しないで、あらかじめリストアイテム分の配列を作っておけば、
>配列のインデックスとリストインデックスが一致するから?(+1が必要かも)
>それなりに出来るでしょうが、やっぱりやりません。
>
>Dim ItemTb() As Long, Tbub As Long
>
>Private Sub ListView1_ItemCheck(ByVal Item As MSComctlLib.ListItem)
>On Error Resume Next
>Tbub = UBound(ItemTb)
>If Err Then
>  Tbub = 1
>End If
>ReDim Preserve ItemTb(1 To Tbub)
>ItemTb(Tbub) = Item.Index
>'MsgBox Item.Index
>End Sub

2544 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free