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

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

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

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

このQ&Aに関連する最新のQ&A

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

追記です。



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

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

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

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

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

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

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

学生さんなんですね。

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


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

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


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

シリアルの制御は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

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

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QEXCEL VBA ワークシートのコピーについて

seaclearsky8です。

一つのブックに何枚ものワークシートを追加して保存するVBAについて
ご教授、よろしくお願いします。

コピー元 

MASTER Book MASTER Workseets

コピー先

Copy Book copy Worksheets


コピー元にはワークシートがMASTERワークシートの一枚しかありません。

その一枚のワークシートに値をVBAで入れていき処理し

コピー先のコピーBOOKにワークシートをコピーしていきたいです。

しかし、MASTERBOOKの処理が何通りかあり、

コピー元の一枚のワークシートに
処理別にデータを写し

コピー先BOOKに

         ワークシート名
ワークシート1 処理1ワークシート 
ワークシート2 処理2ワークシート
ワークシート3 処理3コピー元ワークシート3

という具合にワークシートを複数コピーしたいのですが

処理ごとにデータを代入し、コピー処理はできるのですが。

コピー先BOOK

ワークシート3 処理3ワークシート

だけしかコピーされてないBOOKが作成されます。
上書きされているのだと思われます。

対処法が調べましたが見つけられていません。

すいませんが対処法及び参考VBA等ご教授宜しくお願いいたします。

seaclearsky8です。

一つのブックに何枚ものワークシートを追加して保存するVBAについて
ご教授、よろしくお願いします。

コピー元 

MASTER Book MASTER Workseets

コピー先

Copy Book copy Worksheets


コピー元にはワークシートがMASTERワークシートの一枚しかありません。

その一枚のワークシートに値をVBAで入れていき処理し

コピー先のコピーBOOKにワークシートをコピーしていきたいです。

しかし、MASTERBOOKの処理が何通りかあり、

コピー元の一枚のワークシートに
処理別にデータを写し

コピ...続きを読む

Aベストアンサー

今どういうコードを書いているのか不明なので、とりあえず
「1つのシートを別のブックに複数回コピーする」ための参考ソースを書きます。
コピー元のブックに下記ソースを貼り付けて実行してもらえば
新規ブックにコピー元のシートが3枚コピーされると思います。
(新規ブックを追加しているのでシート数は3枚より多くなります)

Sub copySheet()
Dim masterWb As Workbook
Dim masterSh As Worksheet
Dim copyWb As Workbook

Set masterWb = ThisWorkbook
Set masterSh = masterWb.Sheets(1)
Set copyWb = Workbooks.Add

'ここからが実際のコピー処理です。
'単純に3回コピーメソッドを呼び出して3回コピーしています。
masterSh.Copy before:=copyWb.Sheets(1)
masterSh.Copy before:=copyWb.Sheets(1)
masterSh.Copy before:=copyWb.Sheets(1)

End Sub

今どういうコードを書いているのか不明なので、とりあえず
「1つのシートを別のブックに複数回コピーする」ための参考ソースを書きます。
コピー元のブックに下記ソースを貼り付けて実行してもらえば
新規ブックにコピー元のシートが3枚コピーされると思います。
(新規ブックを追加しているのでシート数は3枚より多くなります)

Sub copySheet()
Dim masterWb As Workbook
Dim masterSh As Worksheet
Dim copyWb As Workbook

Set masterWb = ThisWorkbook
Set masterSh = masterWb.Sheets(1)
Set copyWb = W...続きを読む

Q階層フレキシブル グリッド コントロール のスクロールバーを表示しない状態でスクロールさせる方法は?

VB6.0で階層フレキシブル グリッド コントロールを
3個をそれぞれ明細部・縦計部・横計部として使用して、
スクロールを連動させて表示したいと思っています。
ただ、グリッドコントロールのそれぞれにスクロールバー
を表示させるのはあまり見栄えがよくないので、
垂直スクロールバーで、明細と横計の上下スクロール、
水平スクロールバーで、明細と縦計の左右スクロールを
制御しようと思い、
とりあえず、グリッドコントロールの
ScrollBarsプロパティーをflexScrollNoneに設定してTopRowプロパティーとLeftColプロパティーの値を
適当に設定してみたのですが、左上のセルは(1,1)
が表示されたままでした。

なんとか、うまくスクロールさせる方法はないでしょうか?

Aベストアンサー

スクロールバーを表示していないと、スクロールできないみたいです。(多分)
(ヘルプにはキーボードでの入力時の事しか書いてありませんでした。)

そこで、下記のようにしてみたらどうでしょう?

Private Sub HScroll1_Change()
  With MSHFlexGrid1(0)
    .Visible = False
    .ScrollBars = flexScrollBarHorizontal
    .LeftCol = HScroll1.Value
    .ScrollBars = flexScrollBarNone
    .Visible = True
  End With
End Sub

一部分だけですが・・・
(1)グリッドを非表示にする。(画面のちらつきが起こらないように)
(2)スクロールバーを表示する。
(3)左上のセルを変更する。
(4)スクロールバーを非表示に戻す。
(5)グリッドを表示する。

説明がなくても分かるとは思いますが念のため。
もっと、簡単な方法(設定)があったらすみません。

スクロールバーを表示していないと、スクロールできないみたいです。(多分)
(ヘルプにはキーボードでの入力時の事しか書いてありませんでした。)

そこで、下記のようにしてみたらどうでしょう?

Private Sub HScroll1_Change()
  With MSHFlexGrid1(0)
    .Visible = False
    .ScrollBars = flexScrollBarHorizontal
    .LeftCol = HScroll1.Value
    .ScrollBars = flexScrollBarNone
    .Visible = True
  End With
End Sub

一部分だけですが・・・
(1...続きを読む

QEXCEL VBA ワークシートのコピーについて

seaclearsky8です。

一つのブックに何枚ものワークシートを追加して保存するVBAについて
ご教授、よろしくお願いします。

コピー元 

MASTER Book MASTER Workseets

コピー先

Copy Book copy Worksheets


コピー元にはワークシートがMASTERワークシートの一枚しかありません。

その一枚のワークシートに値をVBAで入れていき処理し

コピー先のコピーBOOKにワークシートをコピーしていきたいです。

しかし、MASTERBOOKの処理が何通りかあり、

コピー元の一枚のワークシートに
処理別にデータを写し

コピー先BOOKに

         ワークシート名
ワークシート1 処理1ワークシート 
ワークシート2 処理2ワークシート
ワークシート3 処理3ワークシート

という具合にワークシートを複数コピーしたいのですが

処理ごとにデータを代入し、コピー処理はできるのですが。

コピー先BOOK

ワークシート3 処理3ワークシート

だけしかコピーされてないBOOKが作成されます。
上書きされているのだと思われます。

対処法が調べましたが見つけられていません。

すいませんが対処法及び参考VBA等ご教授宜しくお願いいたします。

seaclearsky8です。

一つのブックに何枚ものワークシートを追加して保存するVBAについて
ご教授、よろしくお願いします。

コピー元 

MASTER Book MASTER Workseets

コピー先

Copy Book copy Worksheets


コピー元にはワークシートがMASTERワークシートの一枚しかありません。

その一枚のワークシートに値をVBAで入れていき処理し

コピー先のコピーBOOKにワークシートをコピーしていきたいです。

しかし、MASTERBOOKの処理が何通りかあり、

コピー元の一枚のワークシートに
処理別にデータを写し

コピ...続きを読む

Aベストアンサー

> 配列にワークシートのオブジェクトを入れることとか可能なのでしょうか?

それは多分できないと思います。


> 複数のセル・シートを何回もコピーする場合にでるらしいです。

多分、メモリをたくさん使っちゃってるせいでしょうね。
まず、メモリ使用を減らすようにしましょうか。

・testwriteの最後にオブジェクト変数のメモリ解放を行う。
 具体的には以下のように書く。もうやってたらすみません。
Set cbook = Nothing
Set mastersheet = Nothing
・testwriteの中でのブックオープンおよび保存をやめる。
 新規ブックのオープンをtestwriteを呼ぶ前に1度だけ行い、
 testwriteの中ではその新規ブックに対してシートを追加していく。
 そしてtestwriteの処理が全部終わったら、
 新規ブックの全シートを1度に「記録シートYYYY/MM/DD.xls」にコピーする。

それでも駄目でしたら、以下の回答No.1を試してみてください。
http://oshiete.goo.ne.jp/qa/1822561.html

> 配列にワークシートのオブジェクトを入れることとか可能なのでしょうか?

それは多分できないと思います。


> 複数のセル・シートを何回もコピーする場合にでるらしいです。

多分、メモリをたくさん使っちゃってるせいでしょうね。
まず、メモリ使用を減らすようにしましょうか。

・testwriteの最後にオブジェクト変数のメモリ解放を行う。
 具体的には以下のように書く。もうやってたらすみません。
Set cbook = Nothing
Set mastersheet = Nothing
・testwriteの中でのブックオープンおよび保存をやめ...続きを読む

QMSFlexGridのスクロールバー位置

VB5(SP3)です。
ある検索条件でMSFlexGridに100行表示させた後、垂直スクロールバーで50行ほど下方向にスクロールさせます。
この状態で違う検索条件で1行表示させた時、垂直スクロールバーの位置が変わらないため(TOPにこない)に何も表示されません。垂直スクロールバーを上方向にスクロールさせれば出てきます。
垂直スクロールバーをTOP位置に持ってくる方法はありませんか?
MSFlexGrid.VscrollBar.Value=0とかあれば・・・・

Aベストアンサー

VB6でテストしてますので、VB5で確認してみてください。

MSFlexGrid1.TopRow = データ行の先頭
で先頭を表示します。

MSFlexGrid1.FixedRows=0
(見だし行が無い場合はデータ行の先頭は0)
MSFlexGrid1.FixedRows=1
(見だし行が1行の場合はデータ行の先頭は1)

間違った解釈をしてたら補足してください。

QEXCELのVBAでシートコピーをしたとき元のマクロを削除するには?

VBAのマクロでシートのコピーをしたいのですが、元のシートにはVBAのコードが含まれています。コピーするのはデータだけのコピーが必要で、マクロ自体は必要ないのですが、それを削除するコードはどのように書いたらいいのでしょうか?
どうしてもコピーしたファイルを開くと「マクロが含まれています」という確認メッセージが出てしまうのですが、それもなくしたいのです。
シートにフォームのボタンが配置されている場合も同様に、そのボタン自体をなくした状態でコピーを行いたいのですが・・・。プログラムで行うのは不可能なのでしょうか?

Aベストアンサー

No2です。
サンプルコードを書いてみました。
「オリジナル」という名前のシートを別ブックとしてコピペ保存します。

Sub サンプル()
Dim sc As Integer
sc = Application.SheetsInNewWorkbook
Application.SheetsInNewWorkbook = 1
ThisWorkbook.Sheets("オリジナル").Cells.Copy 'コピー
Workbooks.Add 'ブック追加
Sheets("Sheet1").Range("A1").PasteSpecial Paste:=xlValues '値貼り付け
Sheets("Sheet1").Range("A1").PasteSpecial Paste:=xlFormats '書式貼り付け
Sheets("Sheet1").Name = "コピー"
Application.CutCopyMode = False
Application.SheetsInNewWorkbook = sc
ActiveWorkbook.Close
ThisWorkbook.Activate
End Sub

No2です。
サンプルコードを書いてみました。
「オリジナル」という名前のシートを別ブックとしてコピペ保存します。

Sub サンプル()
Dim sc As Integer
sc = Application.SheetsInNewWorkbook
Application.SheetsInNewWorkbook = 1
ThisWorkbook.Sheets("オリジナル").Cells.Copy 'コピー
Workbooks.Add 'ブック追加
Sheets("Sheet1").Range("A1").PasteSpecial Paste:=xlValues '値貼り付け
Sheets("Sheet1").Range("A1").PasteSpecial Paste:=xlFormats '書式貼り付け...続きを読む

QMSFlexGrid, DataGridでヘッダー編集

MSFlexGrid, DataGridでヘッダーを次のように作りたいとですが、出来るのでしょうか。

| 科目 |
| 国語 | 英語  | 数学  |
1 | 50 | 40 | 50 | 40 | 50 | 40 |
2 | 50 | 40 | 50 | 40 | 50 | 40 |
3 | 50 | 40 | 50 | 40 | 50 | 40 |

こんな感じでしたいですが、出来るのでしょうか。
VB6もしくはVB.NETで作りたいですがご存知の方教えてください。ソースコードとか参考になるHPなどお願いします。

Aベストアンサー

MSFlexGridでセルをマージすることが出来ます。

参考URL:
[VB] FlexGrid および HFlexGrid でセルをマージする方法

参考URL:http://support.microsoft.com/default.aspx?scid=kb;ja;JP190225

QVBAのワークシートの追加とコピーなんですが。

VBAのワークシートの追加とコピーなんですが。


sheet1の原紙をすべてコピーして、

新しくワークシートを追加してそのシートに貼り付けるプログラムを

教えてください。

Aベストアンサー

With ActiveWorkbook
  aaa = .Sheets("Sheet1").Cells(9, 4).Value 'aaaは社員
  bbb = .Sheets("Sheet1").Cells(9, 5).Value 'bbbは4月
  .Sheets("Sheet1").Copy After:=.Sheets(.Sheets.Count)
End With
ActiveSheet.Name = aaa & bbb

Qタスクバーの右端の常駐プログラム

VBで作成したプログラムを、タスクバーの右端の常駐プログラム
にセットしたいのですが、どうすればできるのか教えていただけないでしょうか。
よろしくお願いします。

Aベストアンサー

とりあえず .NET であると勝手に固定化しちゃって回答しますんで、VB 6.0 以前や VBA や VBScript なら他の方の回答をお待ちください。

とは言え簡潔に回答できる話でもないので下記をご参考になさってください。
http://www.atmarkit.co.jp/fdotnet/dotnettips/392notifyicon/notifyicon.html
http://www.google.com/search?num=50&hl=ja&q=notifyicon+C%23&lr=lang_ja

QEXCEL2002で、ブック内のワークシートを他のブックに(VBA含む丸ごと)コピーして移す方法

 EXCEL2002で、ブック内のワークシートを他のブックに(VBA含む丸ごと)コピーして移す方法
 普通のやり方では、セルの数字、値だけで、通常は、中身の重要な"関数式"であったり、VBA等のプログラムまで、コピーされることは、ありませんので、そこまで、出来る方法を教えて下さい。

Aベストアンサー

コピー元のBookとコピー先Bookをどちらも開いて
Excel画面上に並べます(左右に並べる方が作業しやすいと思います)

Ctrlキーを押しながら、コピーしたいシートのタブ部分を
クリック長押しすると、+マークと▲マークが出てきます。
マークが出てきたら、新しいBookにドラッグ&ドロップ で
シートコピーが出来ます。

全く同じシートがコピーされ、マクロもコピーされます。

Qグリッドを更新した時のグリッドの表示の仕方

WINDOWS2000、VB6.0(SP5)で開発しています。

データベースをグリッドに表示して、
追加や更新、削除などはテキストボックスに入力して、
コマンドボタンで処理すようにしています。

例えば行を追加したとき、並び替えをして表示させたいので、
Refreshします。そうするとカレントレコードの位置が最初の行になります。
これを追加した行に来るようにしたいです。
Move.Nextとかでその行まで移動させたら出来るのですが、
レコードが100件あって、50番目のレコードを追加したとき、
Move.Nextで移動させると、どんな場合でも画面上一番下の方に表示されてしまいます。
50番目のレコードが一番上に表示されるように、
スクロールバーを調節して追加しても、一番下になってしまいます。
うまく説明できないのですが、ご理解いただけましたら、
ご教授お願いいたしますm(_ _)m

Aベストアンサー

Move メソッドを使う
recordset.Move 移動数, 開始位置

Bookmark プロパティを使う
var = recordset.Bookmark
recordset.Refresh
recordset.Bookmark = var

詳しくはヘルプを参照してください。
テストできる環境がなかったので、ご希望の動作をするかちょっと確認できませんでした(^^;


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報