none
VB.NETライブラリのコントロールをVBAツールボックスに表示させるには RRS feed

  • 質問

  • Windows10 x64

    VS2012

    Excel 2016 x64

    ※Excelは64bitです。

    Excelをx64にするに当たりMSCOMCTL.OCXから脱却しようと思うのですが

    現在のExcelがフォームの中にListViewを使っています。

    ListViewのコントロールはOCXにあるため、OCXを使わなくした場合、ListViewを自作するしかありません。

    VB.NETではListViewがあるため、同じような動作が出来るはずと思っています。(違います?)

    VB.NETでカスタムコントロールを作成し、GUIDを登録して、Excelでも参照出来るようには出来ると思いますが、VBAのツールボックスに

    デザイナーとして登録するにはどうしたらいいでしょうか?

    空のエリアに、カスタムコントロールを配置すれば同じように出来るとは思いますが

    デザイナーで設定もしたいので、可能であれば教えて頂けると助かります。

    ※VB.netかVBAのどちらに書くのか悩みましたが元はVBなのでこちらに記載しました。

    追記)

    そもそも、VBで作ったカスタムコントロールをVBAに表示できるのかもわかっていません。

    出来ない場合はExcelのフォーム削除し、VB.NET画面に移植して、

    IF関数経由で呼び出すしかないかなと思ってます。


    • 編集済み mogja 2018年11月27日 8:18
    2018年11月27日 7:56

回答

  • mogjaさん、こんにちは。フォーラムオペレーターのHarukaです。
    MSDNフォーラムにご投稿くださいましてありがとうございます。

    上記の件につきまして、ちょっと説明したいと思います。
    >ListViewのコントロールはOCXにあるため、OCXを使わなくした場合、ListViewを自作するしかありません。
    →恐れ入りますが、OCXを使用できない特別な理由はありますでしょうか。 
    ご存じの通り、OCXには既にListViewがあり、ListViewを使用する最も簡単な方法はOCXを使用することです。 
    それ以外の場合は、自分でListViewを作成する必要があります。

    >VB.NETではListViewがあるため、同じような動作が出来るはずと思っています。
    →VB.NETからListViewを直接使用することはできません。VBAのActiveXコントロールしか使用できません。

    >VB.NETでカスタムコントロールを作成し、GUIDを登録して、Excelでも参照出来るようには出来ると思いますが、VBAのツールボックスにデザイナーとして登録するにはどうしたらいいでしょうか?
    →VB.NETでActiveXコントロールを作成する必要があります。下記のリンクを参照してください。
    https://blogs.msdn.microsoft.com/asiatech/2011/12/05/how-to-develop-and-deploy-activex-control-in-c/

    >デザイナーで設定もしたいので、可能であれば教えて頂けると助かります。
    →ActiveXコントロールを作成して登録したら、VBAフォームで使用することができます。

    >※VB.netかVBAのどちらに書くのか悩みましたが元はVBなのでこちらに記載しました。
    →VB.NETでActiveX コントロールを作成してみてください。

    >そもそも、VBで作ったカスタムコントロールをVBAに表示できるのかもわかっていません。
    →VBAはActiveXコントロールを参照できます。 それがVB.NETかC#によって開発されたかどうかは関係ありません。

    どうぞよろしくお願いします。


    ~ 参考になった投稿には回答としてマークの設定にご協力ください ~
    MSDN Community Support Haruka

    • 回答としてマーク mogja 2019年1月9日 3:00
    2018年12月12日 2:43
    モデレータ

すべての返信

  • mogjaさん、こんにちは。フォーラムオペレーターのHarukaです。
    MSDNフォーラムにご投稿くださいましてありがとうございます。

    上記の件につきまして、ちょっと説明したいと思います。
    >ListViewのコントロールはOCXにあるため、OCXを使わなくした場合、ListViewを自作するしかありません。
    →恐れ入りますが、OCXを使用できない特別な理由はありますでしょうか。 
    ご存じの通り、OCXには既にListViewがあり、ListViewを使用する最も簡単な方法はOCXを使用することです。 
    それ以外の場合は、自分でListViewを作成する必要があります。

    >VB.NETではListViewがあるため、同じような動作が出来るはずと思っています。
    →VB.NETからListViewを直接使用することはできません。VBAのActiveXコントロールしか使用できません。

    >VB.NETでカスタムコントロールを作成し、GUIDを登録して、Excelでも参照出来るようには出来ると思いますが、VBAのツールボックスにデザイナーとして登録するにはどうしたらいいでしょうか?
    →VB.NETでActiveXコントロールを作成する必要があります。下記のリンクを参照してください。
    https://blogs.msdn.microsoft.com/asiatech/2011/12/05/how-to-develop-and-deploy-activex-control-in-c/

    >デザイナーで設定もしたいので、可能であれば教えて頂けると助かります。
    →ActiveXコントロールを作成して登録したら、VBAフォームで使用することができます。

    >※VB.netかVBAのどちらに書くのか悩みましたが元はVBなのでこちらに記載しました。
    →VB.NETでActiveX コントロールを作成してみてください。

    >そもそも、VBで作ったカスタムコントロールをVBAに表示できるのかもわかっていません。
    →VBAはActiveXコントロールを参照できます。 それがVB.NETかC#によって開発されたかどうかは関係ありません。

    どうぞよろしくお願いします。


    ~ 参考になった投稿には回答としてマークの設定にご協力ください ~
    MSDN Community Support Haruka

    • 回答としてマーク mogja 2019年1月9日 3:00
    2018年12月12日 2:43
    モデレータ
  • すみません、返答が遅くなりました。

    上記の件につきまして、ちょっと説明したいと思います。
    >ListViewのコントロールはOCXにあるため、OCXを使わなくした場合、ListViewを自作するしかありません。
    →恐れ入りますが、OCXを使用できない特別な理由はありますでしょうか。 

    ご存じの通り、OCXには既にListViewがあり、ListViewを使用する最も簡単な方法はOCXを使用することです。 
    それ以外の場合は、自分でListViewを作成する必要があります。

    >>Excelをx86からx64にする場合、OCXがなくなるためになります。

    >VB.NETではListViewがあるため、同じような動作が出来るはずと思っています。
    →VB.NETからListViewを直接使用することはできません。VBAのActiveXコントロールしか使用できません。
    >VB.NETでカスタムコントロールを作成し、GUIDを登録して、Excelでも参照出来るようには出来ると思いますが、VBAのツールボックスにデザイナーとして登録するにはどうしたらいいでしょうか?
    →VB.NETでActiveXコントロールを作成する必要があります。下記のリンクを参照してください。
    https://blogs.msdn.microsoft.com/asiatech/2011/12/05/how-to-develop-and-deploy-activex-control-in-c/

    >デザイナーで設定もしたいので、可能であれば教えて頂けると助かります。

    →ActiveXコントロールを作成して登録したら、VBAフォームで使用することができます。

    >※VB.netかVBAのどちらに書くのか悩みましたが元はVBなのでこちらに記載しました。
    →VB.NETでActiveX コントロールを作成してみてください。
    >そもそも、VBで作ったカスタムコントロールをVBAに表示できるのかもわかっていません。
    →VBAはActiveXコントロールを参照できます。 それがVB.NETかC#によって開発されたかどうかは関係ありません。

    >>ActiveXの作成はやったことないので、結構ハードル高そうですね・・・。うーん。

    どうぞよろしくお願いします。

    >>ありがとうございます。

    2019年1月9日 3:00
  • Office を 32bit に戻せば、MSCOMCTL.OCX をそのまま使えるはずですが
    Office を 64bit にすることは、必須要件なのでしょうか?

    64bit OS でも、明示的に指定しない限りは 32bit 版の Office
    採用されるはずなので、何かしらの事情があるのだとは思いますが…。

    もしも 64bit OCX を作成するのなら、個人的には VB.NET ではなく、
    C++ を用いた方が良いと思います。

    私自身、.NET で ActiveX DLL を作ったことはあるものの、
    .NET で ActiveX コントロールを作ったことは無いのですが、
    検索してみたところ、このような投稿があったので…。

    Windows Forms and Forms that are designed to host ActiveX Controls, such as VB 6 and Office apps, operate on a different message loop. Using a .NET user control directly in a Form designed for ActiveX controls will cause the app to hang.


    もしも Declare 宣言を書き連ねることを厭わないのであれば、
    .NET を利用せずに、64bit VBA のみで完結させることもできるかもしれません。

    いずれの方法を取るにしても、それなりに深い知識が求められそうですが。

    https://paiza.io/projects/e4W5cXTiSqEMWcY80lWUMg

    'UserForm1
    Private Sub UserForm_Initialize()
      Dim Hwnd As LongPtr
      WindowFromAccessibleObject Me, Hwnd
    
      Dim hClient As LongPtr
      hClient = GetWindow(Hwnd, GW_CHILD)
    
      hListView1 = CreateWindowExA( _
        WS_EX_CLIENTEDGE, _
        WC_LISTVIEW, _
        "ListView1", _
        WS_CHILD Or WS_VISIBLE Or WS_TABSTOP Or LVS_REPORT Or LVS_SHOWSELALWAYS, _
        nLeft, _
        nTop, _
        nWidth, _
        nHeight, _
        hClient, _
        0^, _
        Application.HinstancePtr, _
        ByVal 0^)
    End Sub

    2019年1月10日 12:17
  • Office 2019 では逆に変わったらしく、明示的に選ばないと 64bit 版になるらしいです。(同じリンク先のより新しいバージョンの記載に注意)
    2019年1月11日 3:36
    モデレータ