none
Excel を VB6.0(すいませんVBAでなくて、でもほぼ同じようなコードのため)の、Formの上に、小さく表示して、 RRS feed

  • 質問

  • Excel シート風 UIとして(Excelアプリケーションそのものですが)

    エディット、保存などの役割のUI(ユーザーインターフェース・コントロール)として動かそうと考えております。

    Excelシートは、.ini .csv 的な役割を担っています。

    各種コントロールごしに、ユーザーに見えるようにしていましたが、もう実態である、

    Excel シートを小さく、UIのように表示する方法を選択しました。

    ここで、心配があるのですが、FormやForm上のコントロールを触ったら、

    Excelアプリケーションが、後ろになるような心配あります。

    実験すればいいのですが、もしすでに、このような作戦のご経験があり、

    知見がある方が、おられましたら、お願いいたします。

    『Formのコントロール触られても、常に、Excel アプリケーションが、最前面に

    重なって表示する方法を、ご存じな方は、おられますでしょうか?』

    背景:

    過去の先輩が、VB6.0でプログラミングされた作品があります。

        後継モデルで、それを改造必要となりました。

        その作品には、以下のコントロールが使用されています。

        そして、1)2)3)の、UIを達成しています。

        しかし、XP上、Windows7(32ビット)上では、DATAコントロール、DBGridコントロールが動きませんでした。

        OLEコントロールで、再現しようと考えた結果、Windows上なら、Excelが動作するため、

        Excelを、VB6.0で、VBA的なコード書いて、Formの上に、小さく重ねて、

        表示させようという方針となりました。

         ・DATAコントロール

         ・MSFlexGridコントロール

          ・DBGridコントロール


    1)DATAコントロール、MSFlexGridコントロールの組み合わせで、Excel シート風に、見せかけるUI

        2)DATAコントロールと、テキストボックスなどで、accessの Form入力画面的なUI

         3)DATAコントロールと、あまり使う人少ない、DBGridコントロール、1)みたいな機能

         

        

    2014年8月11日 23:37

すべての返信

  • こんな

    'モジュール
    'Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
    'Public Const SWP_NOSIZE As Long = &H1
    'Public Const SWP_NOMOVE As Long = &H2
    '
    'Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    'Public Const GWL_HWNDPARENT As Long = (-8)
    
    'フォーム
    Option Explicit
    
    Private WithEvents xla As Excel.Application
    
    Private Sub Command1_Click()
        Dim xlb As Excel.Workbook
        If (xla Is Nothing) Then
            Set xla = CreateObject("Excel.Application")
            xla.Visible = True
            Set xlb = xla.Workbooks.Add
            xlb.Worksheets(1).Range("A1").Value = Now
            
            Dim hwndExcel As Long
            hwndExcel = xla.hwnd
            If (hwndExcel = 0) Then
                Exit Sub
            End If
            Dim x As Long
            Dim y As Long
            Dim w As Long
            Dim h As Long
            x = Me.Left / Screen.TwipsPerPixelX
            y = Me.Top / Screen.TwipsPerPixelY
            w = Me.Width / 2 / Screen.TwipsPerPixelX
            h = Me.Height / 2 / Screen.TwipsPerPixelY
            
            Call SetWindowPos(hwndExcel, 0, x, y, w, h, 0)
            Call SetWindowLong(hwndExcel, GWL_HWNDPARENT, Me.hwnd)
        End If
    End Sub
    
    #それともSetParent?

    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    2014年8月12日 17:01
  • ありがとうございました。

    とはいえ、なかなか、難しいコードで自分に理解できるか心配ですが

    見させていただきます。

    VB6.0のFormの上に、Excel ブックが、上に表示されたままになるコード

    と理解させていただきます。

    長谷川 浩之

    2014年8月13日 0:12
  • たびたびすいません。

    いただいたコードは、OLEコントロールを使用されています。

    OLEコントロールも使わず、

    VB6.0から、Excelを操作する、Excel VBA にそっくりなコードだけで、

    常に、Form 上に、Excel ブックを、表示させるアイデアをお持ちの方が

    追われましたら、情報ただけますと助かります。

    VB6.0上から、Excel を操作する命令は、

    Excel VBAより少なく、あっても、ほんの一部、ですが文法も違う部分があることを

    昨日初めて体験しました。

    VB6.0から、Excelを操作する命令の、文献を持ち合わせていなく、

    これらの、命令を記述した、サイトは、1つ見つけていますが、

    何か、これらの、説明がされたサイトのURLご存知の方は、情報いただけますと助かります。

    Excel VBA と、VB6.0の、Excelを操作する文法が、微妙に違う例です。

    VBA:

    Range(cells(y1,x1),cells(y2,x2))

    VB6.0:

    Range(sheet1.cells(y1,x1),sheet1.cells(y2,x2))

    Japan 石川県 長谷川浩之

    以上です。

    2014年8月13日 0:28
  • たびたびすいません。

    以下の、サイトにあるように、以下の文法のように

    以下の”メモ帳”の部分を、任意のアプリケーション名に変えれば

    最前面に、なることが実験でわかりました。

    結果、Excelを、Form上に置いた形に、Form上の

    ユーザーインターフェース化のように見せかけるための、必要な仕掛けの一つになりました。

    ただし、Excel以外を触ると後ろに、なるため、Timer関数で、ちょいちょい最前面に

    出るような仕掛けするか、他の仕掛けを考える必要があります。

    他にいいアイデアをお持ちの方は、お手数ですが、情報をいただますと、

    自分や、自分以外のプログラミングする方に役だちます。

    Call AppActivate("メモ帳")

    http://www.openreference.org/articles/view/470

    2014年8月13日 2:04