10
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Offce 2019 VBA 64 bit版のオフィスで使えないはずのListviewやTreeviewが限定的に使える件(追記)

Last updated at Posted at 2020-04-07

MSやGithubでは確かに使えなくなっている

ActiveX コントロールと COM アドインの互換性

既存の 32 ビット ActiveX コントロールは Office の 64 ビット バージョンと互換性がありません。ActiveX コントロールと COM オブジェクトについては、次のようにしてください。

  • ソース コードがあれば、64 ビット バージョンを自分で生成します。
  • ソース コードがなければ、販売元に更新されたバージョンを請求してください。
***Office のネイティブの 64 ビット プロセスでは 32 ビットのバイナリを読み込むことができません。これには、 MSComCtl の一般的なコントロール (TabStrip、Toolbar、StatusBar、ProgressBar、TreeView、ListViews、ImageList、Slider、ImageComboBox) と、 MSComCt2 のコントロール (Animation、UpDown、MonthView、DateTimePicker、FlatScrollBar) が含まれます。***これらのコントロールは、Office 2010 より前の 32 ビット バージョンの Office でインストールされました。64 ビット バージョンの Office にコードを移行するときにこれらのコントロールを使う既存の VBA ソリューションの代替策を見つける必要があります。

確かにMSComCt2は全くその存在すらその他のコントロールで現れない。しかしMSComCtlのものは現れる。

手順

とりあえずExcelはいろいろカスタムしすぎているかもしれないのでWordを使います。

UserFormの挿入

フォームを挿入します
image.png

こんな感じでUserform1ができます。

ツールボックスに配置

そのままでは挿入できないのでToolBoxに配置します。
ここでなぜかできないはずのVB6.0系が選べます。
ImageListは使えませんが、とりあえず起動します。

  • Microsoft Listview Control, Version 6.0
  • Microsoft Imagelistcontrol , version 6.0
  • Microsoft ProgressBar Control, version 6.0
  • Microsoft Treeview Control, version 6.0
  • Microsoft StatusBar Control, version 6.0

image.png
image.png

image.png

なぜか見えないMSCOMCTL.OCX

C:\Windows\System32\MSCOMCTL.OCX
上の画像には確かにMSCOMCTL.OCXと書いてあるようです。
イミディエイトでこれをやってみたらTrueでした。
CreateObject("Scripting.FilesystemObject").Fileexists("C:\Windows\System32\MSCOMCTL.OCX")
なおSYSWowはFalseでした。
このため、単純な参照設定ではできません。

コントロールに名前を付けてカスタマイズ

最初は選択したコントロールには不明としか書いていないため、さらに右クリックしてカスタマイズします。多分以前はこうした現象は起きなかったと思います。また、一度登録すると、そのファイル限定なのか不明ですが、名前が固定され、一度削除してまた追加しても「不明」ではなく自分でカスタムした名前が付きます。

image.png

image.png

UserFormへ各コントロールを配置

image.png

大きさは下のコードに書いてあります。
もとのUserForm1がある程度大きければよいです。
Listviewは小さいと表示されないので、大きめにしてください。
ProgressBar
Status Bar
ListView
TreeView
ImageListを配置しました。

見えづらいと思いますが、iと書いてあるところがStatusBarです。

image.png

Userform1を右クリックしてコードを表示させます。

下記のコードをコピーして貼り付けます。
フォームのモジュールに張り付けることに注意してください。

Option Explicit

'キャンセル処理用フラグ
Public IsCancel As Boolean


'初期化
Private Sub UserForm_Initialize()
Dim i As Long, TargetNode As Node
'キャンセルフラグにFalseを設定
IsCancel = False
With UserForm1
.Height = 384.75
.Width = 552
.Top = 0
.Left = 0
.StartUpPosition = 1
.KeepScrollBarsVisible = fmScrollBarsBoth
.ScrollBars = fmScrollBarsNone
.ScrollLeft = 0
.ScrollTop = 0
.ScrollWidth = 0
.ScrollHeight = 0
.Zoom = 100
.MousePointer = fmMousePointerDefault
End With
With ImageList1
With .ListImages
.Clear
'   .Add
End With
'   .ListImages.Add
'   .ListImages.Add 2, "Sheet", SheetImage
End With
With TreeView1
.Height = 198
.Left = 0
.Top = 0
.Width = 408
.FullRowSelect = False
.HideSelection = True
.LabelEdit = tvwAutomatic
.SingleSel = False
.Sorted = False
.Style = tvwTreelinesPlusMinusPictureText
.Checkboxes = False
.HotTracking = False
.LineStyle = tvwTreeLines
.Nodes.Clear
.Indentation = 14
.LabelEdit = tvwManual
.BorderStyle = ccNone
.HideSelection = False
.LineStyle = tvwRootLines
'.ImageList = ImageList1
'http://officetanaka.net/excel/vba/treeview/05.htm
.Nodes.Add , , "_Name", "氏名"
.Nodes.Add , , "_Address", "住所"
.Nodes.Add "_Name", tvwChild, "tanaka", "田中"
.Nodes.Add "tanaka", tvwChild, , "趣味"
.Nodes.Add "tanaka", tvwChild, , "特技"
End With
    
'http://officetanaka.net/excel/vba/listview/05.htm
With ListView1
''プロパティ
.Height = 120
.Left = 0
.Top = 210
.Width = 510
.AllowColumnReorder = False
.Arrange = lvwNone
.View = lvwReport           ''表示
.LabelEdit = lvwManual      ''ラベルの編集
.HideSelection = False      ''選択の自動解除
.AllowColumnReorder = True  ''列幅の変更を許可
.FullRowSelect = True       ''行全体を選択
.Gridlines = True           ''グリッド線
 ''列見出し
.ColumnHeaders.Add , "_Name", "名前"
.ColumnHeaders.Add , "_Age", "年齢", , lvwColumnCenter
.ColumnHeaders.Add , "_Address", "住所", , lvwColumnRight
End With

With ListView1
 ''1行目
With .ListItems.Add
.Text = "田中"
.SubItems(1) = 38
.SubItems(2) = "横浜"
 End With
 ''2行目
With .ListItems.Add
.Text = "鈴木"
.SubItems(1) = 28
.SubItems(2) = "東京"
End With
 ''3行目
With .ListItems.Add
.Text = "山田"
.SubItems(1) = 41
.SubItems(2) = "埼玉"
End With
End With
'    StatusBar1.ShowTips = True
With StatusBar1
.Left = 456
.Top = 90
.Width = 54
.Height = 30
.Enabled = True
.Font = "MS UI Gothic"
.MousePointer = ccDefault
.Style = sbrSimple
StatusBar1.SimpleText = "test"
End With
'[VBAでプログレスバーフォームを表示する](https://kowaza.withinit.com/vba/vba_ProgressBarForm.html) ただしApplication.cursorはWordでは無効
With ProgressBar1
.Height = 18
.Left = 30
.Top = 336
.Width = 192
.Orientation = ccOrientationHorizontal
.Scrolling = ccScrollingStandard
.Value = 88
End With
End Sub
Private Sub UserForm_Terminate()
Unload UserForm1
End Sub

ImageListだけが動かない

これはプロパティページから登録することができません。
TreeViewのコードはOfficeTanaka大先生のものです。
このTreeviewの使い方はとても勉強になったものです。
しかしながら、この記事の前段の、ImageListの登録ができません。
このため、後半のコードの、Imageは入っていない点がこの記事のコードの違いです。
Image登録の手順のプロパティページを開こうとしても

image.png

Microsoft Visual Basic for Applications
次のクラスは登録されていません。次のCLSIDオブジェクトを参照してください。
{7EBDAAE1-8120-11CF-899F-00AA00688B10}

このようにエラーが出ます。
VBAもClearまではできますが、無理でした。
また

投稿日: 2018年2月24日(2019年6月16日) 投稿者: rohhie
VBAでTreeViewやImageListのプロパティページが開けない

そもそもOffice2019の64Bit版でImagelistが動くなんて話は誰も聞いていないはずでは。
これはうれしいというより、なぜできるのか、なぜListImageはだめなのかよくわかりません。
image.png

バージョン情報をクリックすると。。。が出てきます
image.png
これをクリックすると、バージョン情報が出ます。
image.png
ご覧ください、Word 2019において20年前のControlが動いているのです。これがバグなのか、日本語版だけなのかわかりません。当方のバージョンはInsiderではありません。
もし復活するのであれば、ImageListがなくてもありがたいです。
ProgressBarがなくてStatusBarを工夫したり、
ListViewがなくて改行やTabでMsgBoxで苦労したり
Treeviewがなくて次々と展開する楽しみがなくなったり、
本当にMicrosoft Ofiiceはつまらないソフトになったとあきれていたのですが、こうしてこの世界が終わるかもしれないという2020年4月という状況でまた会えたのはちょっとうれしい経験です。

さよならMSComctlLib

あとImageListはInitializeが出てきません。これもこの機能が使えない理由です。そのくせ初期化を要求するので。
なおStatusBarにiが入っているのは前のコードか、プロパティで入力したためです。見えづらいので残しました。StatusBarに色でも。。。と思ったのですが、色は付けられないみたいです。この世界の終わりにまたくだらないトリビアを見つけてしまった。しかし本当にTreeViewのコードってわかりにくいですね。宇宙際タイヒミューラー理論の方がまだわかりやすいですね。
さよならMSComctlLib。MSComctlLibがないとFormをデザインした気にならない。でも削除される運命のはず。まさか会えるとは思っていなかった。楽しい経験をありがとう。

補足

MSComCt2について

なお、MSComCt2はもし現れるとすれば、Microsoft Windows Common Controls-2 6.0(SP6)という名前になる。
このソースはアニメーション(Animation)コントロールを使って AVI アニメーションファイルを表示する - レスキュー花ちゃん
AnimationというのはAVIファイルを動かすものだったようです。ちなみにリンク先のアニメーションを動かせたら、相当数のおっさんがキュン死するでしょう。
このコントロール群のもっとも有名なものがDateTimePickerです。カレンダー形式で表示され、日付をクリックすると入力される、というものです。なぜこういうのを削るのか理解できないですけどね。

このように復活する原因

[MS12-027] MSCOMCTL.OCX の脆弱性により、リモートでコードが実行される (2012 年 4 月 10 日)
https://support.microsoft.com/ja-jp/help/2664258/ms12-027-vulnerability-in-mscomctl-ocx-could-allow-remote-code-executi

WindowsUpdateによるmscomctl.ocxの影響と思われる症状がありませんか? 2012/4/12 23:24:19
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1485495039

Win vista と Win7
Excel2007 VBA

4月月例アップデートで、「MS12-027」としてMSCOMCTL.OCXがパッチの対象となりましたが、アップデート後、ListViewを含むフォームが「無効なオブジェクトライブラリです。または定義されていないオブジェクトへの参照を含んでいます」というエラーが発生して使用できなくなりました。
Win7は、regsvr32 C:\Windows\System32\MSCOMCTL.OCXを実行することで動作するようになりましたが、Vistaは職場のPCで、管理者権限でのログインが制限されているため、動作しておりません。
自分の環境ではこんな感じなのですが、他の皆さんの環境でも同様でしょうか?

これはMS12-027の修正に伴う副作用となっております。この修正に伴い、MSCOMCTL.OCXが脆弱性のあるバージョンから脆弱性の修正されたバージョンに入れ替えられ、元のバージョンはKillBitが設定されて使用不能になりました。しかしながら、特にOfficeではActiveXコントロール(厳密にはタイプライブラリ)をEXDファイルの形式に変換してキャッシュするため、この古いバージョンが引き続き参照される形になってしまっています。

解決法としては、ユーザーディレクトリ内の%APPDATA%\Microsoft\Formsフォルダ内、及びユーザーテンポラリディレクトリ内のVBEフォルダ内にある、拡張子EXDのファイルを手動で削除することとなります。コマンドプロンプトから「start explorer %APPDATA%」としてMicrosoft→Forms、及び「start explorer %TEMP%」としてVBEディレクトリを開く形となります。
[編注]start explorer %APPDATA%\Microsoft\FormsとするとWindows10でも一発で開けます。

この記述がヒントだと思います。MicrosoftはこのMscomCtl.ocxを削除するのではなく、不可視化してアクセスができないように封印したのです。しかしなぜかこの封印が少し外れています。

封印は2017年7月27日に解除されていた(2020/09/08追記)

x64環境でListViewは使えないはずが、Excel2019 x64でListViewが使える件に関して social.msdn.microsoft.com 2019年7月23日 11:37
これはタイトルをパクっているわけではなく、だいたい使えないと思っていたので(公式もそう書いていたし、実際そういうソースがある)。あと、Googleの検索は「遅れて」検索結果が表示されることがあるので追記するときが出てきます。探し方が悪いのかもしれないけど。

しかし、Windows10 x64 のExcel2019(Professional Plus 2019)ですと
MSCOMCTL.OCXが存在しており、参照するとListViewを表示・追加・操作することができます。
コントールの追加の一覧にもListViewが選択しとして存在し、実際にListViewをフォームに追加することができました。
ただし、なぜかツールボックスに表示される名称は「ListView」ではなく「不明」と出ます。

Excel2019?では、x64のListViewがサポートされたのでしょうか?

64bitでのMSCOMCTL.OCXはoffice365版では2017年7月27日の更新でサポートされるようになってます。
ファイル自体はC:\Program Files\Microsoft Office\root\vfs\Systemにあります。
パッケージ版だと更新は遅れますがおそらく2019でサポートされているでしょう。

Office suite: Non-security updates

  • Add 64-bit support for mscomctl.ocx, allowing users working in 64-bit versions of Office to create, edit, and open macro files containing the Common Controls.
  • Improve accessibility of controls used in mscomctl.ocx.
  • mscomctl.ocxの64ビットサポートを追加すると、64ビットバージョンのOfficeで作業しているユーザーが、コモンコントロールを含むマクロファイルを作成、編集、および開くことができます。
  • mscomctl.ocxで使用されるコントロールのアクセシビリティを改善します。

不明と出るのがアクセシビリティで改善というの、正気なのだろうか。Google翻訳が間違っているのか?
しかしGoogleで"monthly-channel" "mscomctl.ocx"で検索するとこの月次チャネル以降で言及されたことはないらしい。またITMedia等のメジャーなニュースでも扱われていないらしい。とうぜんこんなめちゃくちゃな出現方法では不安で仕方ない。しかも従前のバグを引きずったままのようだ。次がそういう記事になる。

Excel2016でListViewが利用できない❗ answers.microsoft.com 2019/03/29

ワークシートにListViewを配置して、リストに値を表示させる
設定をVBAで行いたいのですが、Excel2010(32Bit)で作成した
ものが Excel2016(32Bit)だと下記の現象(実行時エラー:380:Invalid property value等)が発生して使えなく
なります。

以下の記事に同様の問題で解決されたというコメントがありましたので確認してみるとどうでしょうか。
■Excel VBA listview control gives “Invalid property value” error when setting width
https://stackoverflow.com/questions/34135263/excel-vba-listview-control-gives-invalid-property-value-error-when-setting-wid

  • I know this thread is old, but I ran into this same issue recently when upgrading from Office 2010 to Office 2016 and I hope this answer will help anyone else who gets stuck with this frustrating problem.
  • A workaround that I have found which works fairly well is to auto set the width of each column.
  • 私はこのスレッドが古いことを知っていますが、Office 2010からOffice 2016にアップグレードするときに最近同じ問題に遭遇しました。この回答がこの苛立たしい問題で困っている他の人に役立つことを願っています。
  • 私がかなりうまくいくことがわかった回避策は、各列の幅を自動設定することです。
解決されない場合など、VBA 専用のカテゴリがある 開発者向けの Msdn フォーラム にも投稿して情報を集めてみて下さいね。

返信ありがとうございます。
ListViewの使い方を調べるとユーザーフォームに、配置する事が基本的な使い方の様なので、その方向で考えることにします。
情報ありがとうございました❗

解決したのかしてないのか。。。いずれにしろ古いバグを引きずったままらしい。

Office Update ships ‘wrong’ MSComCTL.ocx (Jan. 2019) Günter Born
Posted on 2019-02-07 by guenni

Windows Update[German]Blog reader Sam pointed out an issue with Microsoft’s MS Common controls (thanks for that), which is causing trouble. Microsoft ships wrong versions of MS Common Controls (MSComCTL.ocx) via Office update. In January 2019 it probably happened again with an Office 2019 update.
Windows Update [ドイツ語]ブログリーダーのSamが、MicrosoftのMS Commonコントロールに問題があることを指摘しました(そのおかげで)、問題が発生しています。 マイクロソフトは、Officeのアップデートを通じて、MS Common Controls(MSComCTL.ocx)の間違ったバージョンを出荷しています。 2019年1月に、Office 2019の更新によりおそらく再び発生しました。
An old case from 2017
(中略なお、2019年のバグは2017年と対比して記載されている)
A new case in 2019?
I guess something like that happened again. Blog reader Sam sent me the following text.

I have noticed that Microsoft delivers another wrong file version of the MS Common Controls (mscomctl.ocx) with the Office January 2019 updates. It affects the following file:

18.01.2019 22:33 1’410’216 MSCOMCTL.OCX
With Office 2019 C2R this is especially stupid, because there is only a new build. A manual deinstallation of the respective update is not possible.
With the other Office versions I found absolutely no hints at Microsoft which patch will deliver the wrong MS Common Controls file version in Dec 2018 or Jan 2019. MS is totally silent here.
Probably because about 2 years ago the same misery has already happended [GB: See my hints above].

Within this Technet thread similar issues with Microsoft Office 365 ProPlus Build 10730.20264 and MSCOMCT.ocx are discussed. Sombody solved it in the following way:

  1. Unregister the OCX by RegSvr32 /u “C:\Windows\SysWOW64\MSCOMCTL.ocx” in C:\Windows\SysWOW64.
  2. Delete the OCX file from C:\Windows\SysWOW64 folder.
  3. Restart the PC.
  4. Place an earlier version of the OCX (6.01.9846) into C:\Windows\SysWOW64.
  5. Register the OCX by RegSvr32 “C:\Windows\SysWOW64\MSCOMCTL.ocx”.
After a re-registration of the replaced .OCX file the controls worked again. Anyone else affected? >2019年の新しい事件? >そのようなことがまた起こったと思います。 ブログリーダーのSamから次のテキストが送られてきました。 > >>私は、MicrosoftがOffice Common 2019(2019年1月)のアップデートで別の誤ったファイルバージョンのMS Common Controls(mscomctl.ocx)を提供していることに気付きました。 次のファイルに影響します。 >> >> 18.01.2019 22:33 1’410’216 MSCOMCTL.OCX Office 2019 C2Rでは、新しいビルドしかないため、これは特に愚かです。 それぞれのアップデートを手動でアンインストールすることはできません。 他のOfficeバージョンでは、どのパッチが間違ったMS Common Controlsファイルバージョンを2018年12月または2019年1月に配信するかというヒントをMicrosoftでまったく見つけられませんでした。MSはここで完全にサイレントです。 おそらく、約2年前に同じ悲惨さがすでに起こっているためです[GB:上記の私のヒントを参照]。

このTechnetスレッド内で、Microsoft Office 365 ProPlusビルド10730.20264およびMSCOMCT.ocxの同様の問題について説明します。 Sombodyは次の方法で解決しました。(以下上の1.から5.の手順)

としているが、そんな古いocxを保存していないのでは。とりあえずこんな情報もMSにはない。
Report of a buggy MSComCTL.ocx in January’s Office patches. Again. AskWoody
この記事はここでも話題になっている。あまり知られていないと思うが、VBAについて検索するとドイツ語、フランス語がかなりヒットするため、ドイツの技術は世界一である。間違ってもシュトロハイムになってはいけない。なお、アドインで深刻な問題がおきるが、一般的には問題がないとされていて、次のところを見る限り、マイクロソフトはしれっと修復したのではないかと思われる。

セキュリティ更新プログラム MS16-004 をインストールした後、エラーメッセージまたは Access がクラッシュする

2020/05/22
適用対象:Access for Office 365, Access 2019, Access 2016, Access 2013, Access 2010, Microsoft Office Access 2007
現象
セキュリティ情報 MS16-004 に記載されているセキュリティ更新プログラム2881067、2881029、3039794、または2920727を適用すると、特定の Windows コモンコントロールを使用した場合に Access データベースに影響する問題が発生します。 具体的には、MSCOMCTL に関連付けられているコントロールを使用すると、これらの問題が発生します。セキュリティ更新プログラムで更新された OCX ファイル。 これらの問題には、次のようなものがあります。

  1. このようなコントロールの1つを含むオブジェクトを開こうとすると、プログラムがクラッシュします。
  2. イベントが取り消されたことを示すエラーメッセージが表示されます。 エラーメッセージの例を以下に示します (ただし、制限はありません)。

Error 459: Object or class does not support the set of events.
2501: action cancelled.
The expression you entered as the event property setting produced the following error: Object of class does not support the set of events.


>原因
この問題は、セキュリティ更新プログラム MS16-004 によって、既存の Access データベースまたはデザインビューで、特定の ActiveX コントロールが正しく読み込まれないことがあるために発生します。
解決方法
To fix this problem, reregister the MSCOMCTL.OCX file. If Method 1 does not fix the problem, you may have to use Method 2 to first manually delete a registry key that's associated with MSCOMCTL.OCX.
~~この問題を解決するには、MSCOMCTL を再登録します。OCX ファイル 方法1で問題が解決しない場合は、最初に MSCOMCTL に関連付けられているレジストリキーを手動で削除するために、方法2を使用する必要があります。脆弱性.~~
この問題を解決するには、MSCOMCTL.OCXファイルを再登録します。 方法1で問題が解決しない場合は、方法2を使用して、最初にMSCOMCTL.OCXに関連付けられているレジストリキーを手動で削除する必要があります。

なぜ2016年のバグを2020年に解決するのか。当然2019年1月の問題をしれっと解決していると見るべきだろう。粗雑極まりない。で、この記事、タイムスタンプが自分の記事よりあとなんだけど、また人の記事を見てしれっと書いたのかねえ。

[MSCOMCTL.ocx を v2.2 → v2.1へ さるころり 2019/10/25](https://xchanko.com/2019/10/25/3488/)
>前世紀の遺物と言われようが、VB6をバリバリ使ってます。
でも、心の友は多いと思うんだ~
このブログの検索上位ワードが MSCOMCTL だもの。
PC色々覚書き
VB6 でMSCOMCTL.OCX を 2.1→2.2 にバージョンアップ
4月にv2.2へバージョンアップした MSCOMCTL.ocx を もう一度 v2.1 に戻す必要が出てきました。何故か?「社長の開発環境が v2.1 だから」←お前もバージョンアップしろよ!

このようにマイクロソフトも相当だが、ユーザーも相当なものなのである。これが古き良きPCワールドである。安楽死なんて言ってないで元気で帰ってきてください。

## 個人的な予想としてはListImageは復活しないと思います
まず、画像をあるフォルダにおいて、それをImageListを初期化して読み込むというのが、筋がよくない。これはローカル、またはスタンドアロンが前提だからです。今はネットにつなぐため、このようにする必要がありません。
次に、勝手定義すると悪意のあるコードがあるファイルを読み込ませる恐れがあり、さすがに無理があります。
以上からこの機能は復活しないと思われます。
じゃあなぜクリアだけ動くのかというと、以前のバージョンで作られたフォームを活用しようとする場合、ImageListさえ削ればセキュリティが上がり使えるようにするためだと思います。このため、削除する機能だけが存在するのでしょう。



## VB60のアップデートについて
https://rohhie.net/i-can-not-open-the-property-page-of-treeview-or-imagelist-in-vba/
こちらに紹介されている方法を行いましたが、あまり変化はないようです。ただし、なぜか成功だけはします。

10
4
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?