アプリ版:「スタンプのみでお礼する」機能のリリースについて

1)グリッド上で文字を直接入力したいのですが,どのようにすればよいのでしょうか。具体的には,エクセルのようにグリッド上をクリックしたら,そのグリッドがテキスト入力モードになるような方法を教えて頂きたいと思います。

2)MSFlexGridに描かれる垂直スクロールバーの,幅の値を得る方法を教えてください。(スクロールバーを表示させるとグリッドの右端が切れてしまうため)

3)エクセルのソルバーアドインを,VBから使用することはできますか? 複雑な回帰分析を行わせようと考えておりますので,できればエクセルのアドインをそのまま使えれば…,と考えております。

以上,よろしくお願いいたします。

A 回答 (5件)

まず2つ質問です。


1.1番の質問はフレックスグリッドについての質問ですよね?
2.フレックスグリッドでなければいけないのですか?DataGridではダメなのですか?もしくは直接エクセルではダメなのですか?

わかる範囲で書きますね。
1番(仮にフレックスグリッドだと思って勝手に書きます)
基本的な標準機能では、存在しません。
マウス座標、表示上のLEFT/TOPのグリッド位置、グリッドの幅高さから計算して、テキストボックスを表示/非表示といった方法しか考えられませんが・・・

2番 現在スクロールバーが表示されてるか非表示されてるかは、Cols/RowsとWidthで自分で計算する方法しかわかりません・・・
幅/高さについては
Private Const SM_CXHSCROLL = 21&  '水平スクロールバーの矢印の幅
Private Const SM_CYHSCROLL = 3&   '水平スクロールバーの高さ
Private Const SM_CXHTHUMB = 10&   '水平スクロールバーのスクロールボックス(つまみ)の幅
Private Const SM_CXVSCROLL = 2&   '垂直スクロールバーの幅
Private Const SM_CYVSCROLL = 20&  '垂直スクロールバーの矢印の高さ
Private Const SM_CYVTHUMB = 9&   '垂直スクロールバーのスクロールボックス(つまみ)の高さ
Private Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long

  Debug.Print GetSystemMetrics(SM_CXVSCROLL)
で、何とかなるのかな?
参考URL参照

3番 アドインはエクセルのセル型を読み取って、エクセル内部による処理を行います。基本的には無理だと思います。機能を生かすだけなら、一度エクセルにデータを貼り付けて、解析をさせて、結果を読み取る必要があります。しかしエクセル任せになるので、ダイアログなどが表示されるかもしれません。(未検証)

参考URL:http://www.microsoft.com/JAPAN/developer/library …

この回答への補足

早速のご回答,ありがとうございます。

> 1番の質問はフレックスグリッド
> フレックスグリッドでなければいけないのですか?

まず,説明が足りず申し訳ございませんでした。
フレックスグリッドについての質問です。が,フレックスグリッドを使用している理由はありません。それぞれの方法の利点,欠点がよく分からないため。適当に選んだだけです。もし宜しければ,DataGridや直接エクセルを使用する方法についても教えていただけると幸いです。

> テキストボックスを表示/非表示といった方法

そうですか。その方法しかありませんか。分かりました。

> 幅/高さについては

非常に参考になりました。ありがとうございます。

> 機能を生かすだけなら、一度エクセルにデータを貼り付けて、解析をさせて、

この方法で一向に構いません。具体的にはどのような手順になりますか? もし宜しければ教えて下さい。

質問ばかりになってしまい,大変申し訳ございませんが,どうかよろしくお願いいたします。

補足日時:2001/11/09 11:13
    • good
    • 0

1番についてです。


DataGrid or Excel どちらでしょう?
ちなみにフレキシブルグリッドはグリッドのマージ(結合)や色を付けたりするのに適してます。
DataGridはエクセルのような直接グリッド内を編集できますが、マージは無理で、色付けの設定はグリッド単位では指定できません。
Excelは説明を省略します。

全てのパターンの使用例は勘弁してください・・・(^^;)
とりあえず、何がしたいのかが知りたいです。
ちなみにエクセルでの機能を使用する時点で、VBAのみの処理にした方がいいような気もします。。。



3番についてです。
処理としては
1.エクセル起動
2.エクセルブックを開く
3.エクセルブックにデータを出力
3.エクセルブック内の関数を呼ぶ(エクセル内にマクロを用意)
4.解析データを得る(サンプルではメッセージボックスをコメント化してます)
といった要領です。


解析は得意ではないので、エクセル側の関数「subAnalysis」は自分で編集してくださいね。
エクセルのヘルプのキーワードで「solver」と打ち込むと使用方法が出ています。

VBのプロジェクトの参照設定で
[Microsoft Excel x.0 Object Liblary]
を指定することが必要です。
それ以外に、エクセルのブックを一つ用意して(サンプルではC:\Test.xls)VBA画面でツールの参照設定から
C:\Program Files\Microsoft Office\Office\Library\Solver\SOLVER.XLA
を指定しておく必要があります。これはソルバーの関数ライブラリなので、あらかじめ用意するブックに関連付けしておかなければなりません。ですので、参照設定をして保存してください。

エクセルブック内の関数ではデータ範囲が固定で書いてありますが、データ範囲の取得方法などがわからない場合は、別の質問で行ってください。本題から外れます。
解析データの出力先をシート2の先頭にしておくと、解析データを取得しやすいかもしれませんね。


-----VB側-----
Option Explicit

Sub Main()
  Dim xlApp  As Excel.Application
  Dim xlBook As Excel.Workbook
  Dim xlSheet As Excel.Worksheet
  
  'エクセル起動
  Set xlApp = New Excel.Application
  'ワークブックを開く
  xlApp.Workbooks.Open ("c:\test.xls")
  Set xlBook = xlApp.ActiveWorkbook
  
  'シートを指定
  Set xlSheet = xlBook.Worksheets(1)
  xlSheet.Select
  
  'データをセットする
  Call xlsDataSet(xlSheet)
  
  '表示する
  xlApp.Visible = True
  
  '解析を行う(エクセル任意)
  Call xlApp.Run("subAnalysis")
  
  '解析した値を読み込む(解析値の出力によってここは変わります)
  '''''Call MsgBox(xlSheet.Cells(x, x).Value)
  
  
  '閉じる時の「保存しますか」を表示させない
  xlBook.Saved = True
  
  Set xlSheet = Nothing
  Set xlBook = Nothing
  Set xlApp = Nothing
End Sub

'受けたシートにデータを出力(テスト用のダミーデータ)
Sub xlsDataSet(xlSheet As Excel.Worksheet)
  Dim i  As Long
  Dim j  As Long
  
  For i = 1 To 30
    For j = 1 To 30
      xlSheet.Cells(i, j) = i & j
    Next j
  Next i
End Sub


-----EXCEL_VBA側-----
Sub subAnalysis()
  Worksheets(1).Activate
  With Worksheets(1)
    Call SolverReset
    Call SolverOptions(Precision:=0.001)
    SolverOK SetCell:=Range("F4"), MaxMinVal:=1, ByChange:=Range("C4:E6")
    Call SolverAdd(CellRef:=Range("F4:F6"), Relation:=1, FormulaText:=100)
    Call SolverAdd(CellRef:=Range("C4:E6"), Relation:=3, FormulaText:=0)
    Call SolverAdd(CellRef:=Range("C4:E6"), Relation:=4)
    Call SolverSolve(UserFinish:=False)
    Call SolverSave(SaveArea:=Range("A33"))
  End With
End Sub

この回答への補足

再び早速のご回答,大変ありがとうございました。

> とりあえず、何がしたいのかが知りたいです。

大変申し訳ございませんでした。ご説明いたします。

今私は,大学の研究室で光学実験を行うためのプログラムを作成しております。具体的には,ステッピングモーター,シャッター,オシロスコープ等をGPIBで操作,また試料温度をのRS-232Cで制御し,入力された手順に従って測定,データ収集,データ解析を行うプログラムを作成しております。

プログラムの流れは大ざっぱに,
 1.測定手順の入力(ここで,入力用にグリッドを使用)
 2.自動測定,データ収集
 3.データの解析(ここで,エクセルの回帰分析を使用)
という感じで,この1の部分で,測定条件を各グリッド内に直接書かせようと考え,3の部分でエクセルに回帰分析を行わせようと考えました。なお回帰分析とは,n個の測定点 (xn,yn) が式 y = A * {sin(x - B)}^2 に合うように非線形最小二乗法を行って A と B を求めるという内容です。この部分は自分ではアルゴリズムが分からないため,エクセルに頼ろうと考えました。

> 1番についてです。
> DataGrid or Excel どちらでしょう?

逆にお伺いする形になってしまい,申し訳ありません。グリッドはデータの直接入力機能と,コピー&ペースト程度の編集機能さえあれば構わないのですが,その程度なら DataGrid でも十分でしょうか? どちらかと言えば動作が軽い方がいいのですが…。

> 3番についてです。
> 処理としては
> 1.エクセル起動
> 2.エクセルブックを開く
> 3.エクセルブックにデータを出力
> 3.エクセルブック内の関数を呼ぶ(エクセル内にマクロを用意)
> 4.解析データを得る(サンプルではメッセージボックスをコメント化してます)
> といった要領です。

ご指示の通り,やってみたいと思います。
ご丁寧に,大変ありがとうございました。

補足日時:2001/11/10 15:00
    • good
    • 0

>今私は,・・・プログラムを作成しております。


難しそうですね・・・理解しきれてません。。。

シリアルの制御はVBで行っているわけではないのですか?
それならばエクセルで処理を全て済ましてしまってもいいような気がします。販売用のソフトでもないみたいですし、エクセルのみの処理にした方がメンテを行いやすいと思います。


VBで入力画面を作成したいのであれば、DataGridで十分だと思います。
処理内容からするとGird部分は単なる入力用みたいなので、DataGridで十分だと思います。
DataGridを薦める理由にはもう3つあります。
1.サンプルが入手しやすい。
2.グリッド内の直接入力とあったので、DataGridがいいと思った。
3.勝手な推測ですが、「エクセルのような」と、「解析を行う」ということで、「履歴を残すのでは?」と思ってデータベースを使用したほうがいいと思った。(おせっかい?)

もしDBが必要ないのであれば、やはりエクセルのみの処理で十分のような気がしますが・・・
(エクセルでもDB操作できちゃいますけど。。。)

もしDBが必要で、DataGridのサンプルが欲しかったら、VB6のアプリケーションウィンザードに入ってますけど、わからなかったら言ってください。(必要なソフト:Access)


それと解析の方なのですが・・・
一度VBAで組んだことがあって、ちょっとかじった程度なのです。式を見てちょっとVBA部分の変更をかけたのですが、うまくいきませんでした。。。
(T▽T)

この回答への補足

 ご回答ありがとうございます。TAGOSAKU7 さんは VB のプロだとお見受けしますが,プロの方に直接お伺いすることができて,非常に嬉しく思います。

> シリアルの制御はVBで行っているわけではないのですか?

 いえ,MSComm コンポーネントを使用して直接 RS-232C 機器を制御する予定です。また,C バス上の GPIB ボード,同じく C バス上の高速カウンターボード,PCI バス上のマルチファンクションボードにも,直接アクセスする予定です。(余談ですが,使用している PC は NEC の PC-9821 です)

 これらのボードのメーカーに問い合わせたところ,VB なら間違いなく対応しているとのことでしたので,それならばという事で VB で作り始めたのです。VBA も対応しているかは,…ちょっと分かりません。

> 販売用のソフトでもないみたいですし、

 私はまだ学生です。そして作るプログラムも,研究室内の測定機器に合わせた特殊仕様です。自分でプログラムを組まない限り実験ができないという状況なのです…。(汗)

> 処理内容からするとGird部分は単なる入力用みたいなので、DataGridで十分だと思います。

 ご助言の通り,DataGrid で進めていきたいと思います。直接入力ができるというのは便利そうですね。

 DB に関しては,それを導入する意味すら分かっていない状況です。(苦笑) ただ,測定結果の統計的な解析などは行わず,生データもカンマ切りのテキストファイルで残せれば十分です。

> それと解析の方なのですが・・・

 私も,エクセルの「マクロの登録(だったかな?)」という機能で自動的に VBA のソースを作らせ,それを元にして,複数の回帰分析を逐次処理するようなマクロを作ろうとしたことがありました。しかし,VBA ではなぜかソルバーは動きませんでした。ソルバーの代わりにゴールシークで回帰分析を行うと,こちらは問題なく動くのですが…。

 この件もまだ未解決ですが,今しなければいけないプログラミングの内容を考えると,こちらはまだまだ先の話です。将来この件で切羽詰まったときは,また別のスレッドでお伺いすることになるかもしれません。そのときはどうかまたよろしくお願い致します。

補足日時:2001/11/11 01:23
    • good
    • 0

学生さんなんですね。

。。てっきりどこかの研究所だと思ってました。。。
向上心のある学生さん大歓迎です。


DataGridのサンプルです。

サンプル開発環境
VB6/SP5
開発参考用
Access2000

データはフィールドは関数creLogDbで「adInteger」で設定しているために、半角数字しか対応してません。
フィールドタイプを変更したい時は、
http://www.microsoft.com/JAPAN/developer/library …
を参考にしてください。

データ項目は常に上書きモードになってます。
編集/追加をする時はカレントのグリッドの上で数字を打ち込み、Enterで確定します。
カーソルキーで、データグリッド内のグリッドを移動します。
データの削除は、行ヘッダをクリックして、削除したい行を選択後に、「DELETEキー」でデータの削除が行えます。

Accessが入っていたら、定数logFileデータベース内のlogTblテーブルを編集することにより、データを直接編集することができます。

フォームに以下のコードを貼り付けてください。

必要なコンポーネント
Microsoft ADO Data Control 6.0 (SP4) (OLEDB)
Microsoft DataGrid Control 6.0 (SP5) (OLEDB)
必要な参照設定
Microsoft ActiveX Data Objects 2.5 Library
Microsoft ADO Ext 2.5 for DDL and Security

必要なオブジェクト/コントロール
フォーム[Form1]
DataGrid[DataGrid1]
ADODC[ADODC1]
各コントロールは適当に貼り付けてください。プログラム中で初期設定を行ってます。


Option Explicit

'アクセスDBとの接続のお決まり言葉
Private Const ConnectConst As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="

'ログDBファイル名
Private Const logFile  As String = "C:\LOG.mdb"
'ログテーブル
Private Const logTbl  As String = "LogTbl"

'カレントグリッドが移った時に現在の位置をADODC1に表示する
Private Sub Adodc1_MoveComplete(ByVal adReason As ADODB.EventReasonEnum, ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, ByVal pRecordset As ADODB.Recordset)
  Dim wkCnt  As Long
  Dim wkStr  As String
  With Me
    'レコードカウントを得る
    wkCnt = pRecordset.RecordCount
    
    'データが存在しない
    If wkCnt = 0 Then
      wkStr = "データが存在しません"
    
    'データが存在するとき、ADODBにカレントレコード情報を表示
    Else
      wkStr = pRecordset.AbsolutePosition & "/" & wkCnt
    End If
    .Adodc1.Caption = wkStr
  End With
End Sub

'フォームロード
Private Sub Form_Load()
  Dim wkVal  As Variant
  
  'ログDBファイルが存在しない時、ログDBファイルの作成を行う
  If Not FileExt(logFile) Then
    '項目名をセット
    wkVal = Array("項目1", "項目2", "項目3")
    Call creLogDb(logFile, logTbl, wkVal)
  End If
  
  With Me
    'フォームの初期設定
    .ScaleMode = vbPixels
    
    With Adodc1
      'ADODCをフォーム下に位置付ける
      .Align = vbAlignBottom
      
      'ログDBファイルに接続
      .ConnectionString = ConnectConst & logFile
      .RecordSource = "select * from " & logTbl
      .Refresh
    End With
    
    'データグリッドの初期設定
    With .DataGrid1
      '追加/更新/削除の許可
      .AllowAddNew = True
      .AllowUpdate = True
      .AllowDelete = True
    End With
    
    'データグリッドに反映
    Set .DataGrid1.DataSource = .Adodc1
    .DataGrid1.ReBind
  End With
End Sub

'フォームのサイズ変更時
Private Sub Form_Resize()
  'フォームサイズが変更されたらデータグリッドのサイズも変更してあげる
  With Me
    .DataGrid1.Left = 0
    .DataGrid1.Top = 0
    .DataGrid1.Width = .ScaleWidth
    .DataGrid1.Height = .ScaleHeight - .Adodc1.Height
  End With
End Sub

'--------------------------------------------------------
'  関数名 : FileExt
'  用途  : ファイルが存在するかどうか調べる
'  引数  : strPathName ファイル・ディレトクリ(パス)名
'  戻り値 : True ファイルは存在する
'       False ファイルは存在しない
'--------------------------------------------------------
Public Function FileExt(strPathName As String) As Boolean
  
  '引数のサイズを格納/ファイル番号を格納
  Dim lngPNameSize As Long

  'エラーを無効にしておく
  On Error Resume Next

  '引数のファイル名・パス名がセットされていない
  If strPathName = "" Then
    '関数を抜ける
    Exit Function
  End If

  'パス名の最後にディレクトリ記号がある場合は削除
  If Right(strPathName, 1) = "\" Then
    'パスのサイズ-1を格納
    lngPNameSize = Len(strPathName) - 1
    '最後の一文字を取り除く
    strPathName = Left(strPathName, lngPNameSize)
  End If
  
  'ファイルを開いて、エラーかどうか確かめる
  '現在使用可能なファイル番号を割り振る
  lngPNameSize = FreeFile
  
  'では、開く
  Open strPathName For Input As lngPNameSize
  FileExt = (Err.Number = 0)
  Close lngPNameSize
  
  'エラー値を初期化
  Err.Clear

End Function


'ログDBファイルを作成
Private Sub creLogDb(inFileName As String, inTblName As String, valFieldAry As Variant)
  Dim Cat As ADOX.Catalog
  Dim Tbl As ADOX.Table
  Dim valWork As Variant
  
  'DBファイル作成
  Set Cat = New ADOX.Catalog
  Cat.Create ConnectConst & inFileName
  
  'テーブル情報/フィールド作成
  Set Tbl = New ADOX.Table
  Tbl.Name = inTblName
  For Each valWork In valFieldAry
    'ここは整数型でデータフィールドを作成してます
    Tbl.Columns.Append valWork, adInteger
    Debug.Print Tbl.Columns.Count
  Next valWork
  'このタイミングでテーブル作成
  Cat.Tables.Append Tbl
  
  Set Tbl = Nothing
  Set Cat = Nothing
End Sub
    • good
    • 0

追記です。



>複数の回帰分析を逐次処理するようなマクロを作ろうとしたことがありました。しかし,VBA ではなぜかソルバーは動きませんでした

この発言ですが、#2で発言したことをやってみたら動きます。

「VBA画面でツールの参照設定から
C:\Program Files\Microsoft Office\Office\Library\Solver\SOLVER.XLA
を指定しておく必要があります。これはソルバーの関数ライブラリなので、あらかじめ用意するブックに関連付けしておかなければなりません。」
という部分です。
マクロを記録した後に、VBA画面で参照設定してあげてください。
    • good
    • 0
この回答へのお礼

まずは返事が遅れましたことをお詫び申し上げます。大変申し訳ございませんでした。

>#2で発言したことをやってみたら動きます。

こちらでも,動くことを確認しました。このたびは本当にお世話になり,ありがとうございました。これからも,どうかよろしくお願い申し上げます。

お礼日時:2001/11/16 12:05

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!