[[20150126023341]] 『転記方法の切り換えて利用するには』(KK) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『転記方法の切り換えて利用するには』(KK)

よろしくお願いします
ユーザーフォーム上のコマンドボタンで
転記方法の優先順位を選択するには
マクロ-1はListView1を選択してからコマンドボタンにて転記
マクロ-2はListView1を直接クリックして転記
上記2つの転記方法を、切替て利用する方法を教授お願いします。

マクロ-1
Private Sub CommandButton3_Click()
With ActiveCell

    If .Column <> 3 Then
        MsgBox "C列へ"

    Else
            .MergeArea.ClearContents
            ActiveCell = ListView1.SelectedItem.SubItems(1)
            ActiveCell.Offset(, 0) = ListView1.SelectedItem.SubItems(1)
            ActiveCell.Offset(, 1) = ListView1.SelectedItem.SubItems(2)
            ActiveCell.Offset(, 2) = ListView1.SelectedItem.SubItems(3)
            ActiveCell.Offset(, 3) = ListView1.SelectedItem.SubItems(4)
            ActiveCell.Offset(, 4) = ListView1.SelectedItem.SubItems(6)
    ActiveCell.Offset(0, 5).Select
    End If
    AppActivate Application.Caption
End With
End Sub

マクロ-2
Private Sub ListView1_ItemClick(ByVal Item As MSComctlLib.ListItem)
同上同一コード
End Sub

< 使用 Excel:Excel2013、使用 OS:Windows7 >


 どちらか、一方だけの記述にしておいたらいいのでは?
 と思いますが、たとえば。

 CheckBoxを使い、キャプションを【コマンドボタンを利用する】といったものにして、

 CommandButton3_Click の先頭に

 If Not CheckBox1.Value Then Exit Sub

 ListView1_ItemClick の先頭に

 If CheckBox1.Value Then Exit Sub

 こうしておくとか。

 それと、テーマとは関係ありませんが、実行時のActiveCellがC列じゃないとだめという
 コードですけど、ActiveCellがある行の C列〜G列に対する処理コードにすればいいのでは?

 ついでに、最後にH列を選択している意味が、ちょっとわからないですね?
 まぁ、何か必要性があるからでしょうけど。

(β) 2015/01/26(月) 05:32


 おせっかいかもしれませんが気になったので。

 ・同じコードが2か所にあるのは、何か変更があった時に2か所、同じように直さなきゃいけない、
  そのときにミスって、同じだったはずのロジックが、異なってしまう なんてことがよくあります。
  このようなケース、サブプロシジャ立てのするのが一般的です。
 ・With ActiveCell でくくっておられるんですが、活用されているのは .MergeArea.ClearContents だけ。
  ほかは、With でくくっているのに、 ActiveCell という記述が、ずらっと。
 ・また、ListView1.SelectedItem.SubItems(1) 等、深い階層のオブジェクト参照が何度もでてきます。
  同じくくるなら、むしろ、With ListView1.SelectedItem とやって使うほうが、すっきりしますし、
  効率もよろしいかと。
 ・そのSubItemですが、ActiveCell に 2回、ListView1.SelectedItem.SubItems(1) をセットしているのは何か意味が?
 ・また、最後のListView1.SelectedItem.SubItems(6)は、もしかしたらListView1.SelectedItem.SubItems(5) ?

 以下にコード例を。
 ところで、ListView、以前から、これはエクセルVBAで使っていいのかだめなのか、その権利関係について
 さまざまなところで議論がありましたけど、いままでは、【まぁ、自分だけで使う分には、OKだろう・・】
 こんな感じで当方でも使ってました。

 でも、我が家のPC,昔の Win7+xl2010では使えるんですが、Win8.1+xl2013 では、使おうとすると
 使う権利がないというメッセージがでて、プロテクションがかかっています。
 まぁ、Microsoftも、やっと本腰を入れて権利の主張に乗り出したというところですかね?

 (なお、以下のコード、書いただけでテストしてませんので不具合あればご容赦)

 Private Sub CommandButton3_Click()
    If Not CheckBox1.Value Then Exit Sub
    CellSet
 End Sub

 Private Sub ListView1_ItemClick(ByVal Item As MSComctlLib.ListItem)
    If CheckBox1.Value Then Exit Sub
    CellSet
 End Sub

 Private Function CellSet()

    If ActiveCell.Column <> 3 Then
        MsgBox "C列へ"
    Else
        With ListView1.SelectedItem
            ActiveCell.Resize(, 5).Value = Array(.SubItems(1), .SubItems(2), .SubItems(3), .SubItems(4), .SubItems(5))
        End With
    ActiveCell.Offset(0, 5).Select
    End If

    AppActivate Application.Caption

 End Function

(β) 2015/01/26(月) 08:29


βさん
ありがとうございます。
完璧動作確認しました。
ところで気になる事が書いてありましたので調べて見ました
以下です
ht tp://answers.microsoft.com/ja-jp/office/forum/office_2013_release-excel/listview%E3%81%8Cuserform%E3%81%AB%E9%85%8D/625f61dd-50d2-4c6c-825e-b1502dacd95c?msgId=676473a7-19fb-4a24-b36c-0100cec899a1

Win8.0+Excel2013で、利用出来るとのことでした。
安心しました。ListViewを利用したマクロbookを結構作成済でしたから
βさんは、ListBoxで代用しているのでしょうか?

(KK) 2015/01/26(月) 14:30


 すでに作成済みのものは、問題なく動きますが、新しく作ろうとした場合、
 こちらの環境は、Officeが32ビットですので、Microsoft ListView Control, version 6.0 ではなく
 Microsoft ListView Control, version 5.0 のほうなんですが、これをユーザーフォームに配置しようとすると
 ↑でコメントしたような状態になります。
 メッセージはライブラリーが見つからない ではなく、正式ライセンスがないというものです。
 まぁ、今のところ新規で作る気力がないので、ほおってあります。

(β) 2015/01/26(月) 15:50


βさん
ありがとうございました。
また相談に乗ってください。
解決とします。

(KK) 2015/01/26(月) 16:08


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.