• 検索結果がありません。

フレキシブルグリッド応用

N/A
N/A
Protected

Academic year: 2021

シェア "フレキシブルグリッド応用"

Copied!
29
0
0

読み込み中.... (全文を見る)

全文

(1)

■ フレキシブルグリッドの利用 ■ ■ セルに直接データーを入力する 指定セルの内容の直接編集を擬似的に実施する方法は、下記の通りで有る。 ・アクティブセルの上にテキストボックスをセルと同じ大きさで表示 ・Enter キーに依るセルの移動(↓ → 選択可能) ・タブキーに依る移動(← → 選択可能) 以上の設定は、エクセルでのセル内編集と粗同じ動きをする様に設定する物で有る。後は、各自都合の良い様に 機能を改良すると良い。 1.Form に MSFlexGrid とテキストボックスを3個下記の様に貼り付ける。 2.フォームの宣言セクションに、下記のコードを記述する。 Option Explicit

Private NextCell As Integer ' Enter 入力の後の移動方向の選択 3.フォームロードイベントに、下記のコードを記述する。

Private Sub Form_Load()

Dim I As Long ' ループ用カウンタ Form1.Move 0, 0, 8640, 4000 ' MSFlexGrid の初期設定 With MSFlexGrid1 .Move 150, 150, 8170, 2850 .Rows = 10 ' 行の総数(固定行含む)

(2)

.Cols = 8 ' 列の総数(固定列含む) .FixedRows = 1 ' 固定行の数(Rows より1以上尐ない事) .FixedCols = 1 ' 固定列の数(Cols より1以上尐ない事) .Row = 0 .ColWidth(0) = 430 ' 列幅 .ColWidth(1) = 550 .ColWidth(2) = 1800 For I = 3 To 7 .ColWidth(I) = 1000 Next I .RowHeight(0) = 350 ' 行の高さ ' 固定行セルの項目名を中寄/中寄で表示

.Col = 1: .Text = "No": .CellAlignment = flexAlignCenterCenter .Col = 2: .Text = "氏 名": .CellAlignment = flexAlignCenterCenter .Col = 3: .Text = "国 語": .CellAlignment = flexAlignCenterCenter .Col = 4: .Text = "数 学": .CellAlignment = flexAlignCenterCenter .Col = 5: .Text = "英 語": .CellAlignment = flexAlignCenterCenter .Col = 6: .Text = "合 計": .CellAlignment = flexAlignCenterCenter .Col = 7: .Text = "平均点": .CellAlignment = flexAlignCenterCenter .Col = 0 For I = 1 To .Rows - 1 .RowHeight(I) = 350 ' 行の高さ .Row = I .Text = I ' 行番号を表示 Next I .Col = 1: .Row = 1 .FocusRect = flexFocusNone .HighLight = flexHighlightAlways End With With Text1 .BackColor = &H80FFFF ' 動きが解り易い様に .Text = "" .Visible = False End With End Sub ' MSFlexGrid コントロールからテキストボックスにフォーカスを移動

Private Sub MSFGEdit(MSFlexGrid As Control, Edit As Control, KeyAscii As Integer) ' 入力された文字の使用

Select Case KeyAscii

' 空白は、現在のテキストの編集を示す。 Case 0 To vbKeySpace Edit = MSFlexGrid Edit.SelStart = 1000 '其の他は、現在のテキストを置き換える。 Case Else Edit = Chr$(KeyAscii) Edit.SelStart = 1 End Select ' セルの位置にテキストボックスを表示 With MSFlexGrid

Edit.Move .Left + .CellLeft, .Top + .CellTop, .CellWidth, .CellHeight End With

Edit.Visible = True ' 実行する。 Edit.SetFocus End Sub

(3)

' テキストボックスの編集機能のルーチンへ

Private Sub MSFlexGrid1_KeyPress(KeyAscii As Integer) Call MSFGEdit(MSFlexGrid1, Text1, KeyAscii)

End Sub

' テキストボックスの編集機能のルーチンへ Private Sub MSFlexGrid1_DblClick()

Call MSFGEdit(MSFlexGrid1, Text1, vbKeySpace) ' 空白を代入する End Sub

4.以上で、一応、入力テキストボックスに入力が可能に成る。引き続き下記のコードを記述する。 ' 改行文字を削除し、警告音が発生し無い様にする。

Private Sub Text1_KeyPress(KeyAscii As Integer) If KeyAscii = vbKeyReturn Then

KeyAscii = 0 End If

End Sub

' 入力キーの判定移動処理へ

Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer) Call EditKeyCode(MSFlexGrid1, Text1, KeyCode)

End Sub

' フォーカスを移動するルーチン

Private Sub EditKeyCode(MSFlexGrid As Control, Edit As Control, KeyCode As Integer) With MSFlexGrid

' 標準の編集コントロールの処理で有る Select Case KeyCode

Case vbKeyEscape ' Esc キーは、非表示にしてフォーカスを MSFlexGrid に戻す。 Edit.Visible = False

.SetFocus

Case vbKeyReturn, vbKeyTab ' Enter と Tab に依るフォーカス移動。 ' ↓移動を選択した場合

If NextCell = 1 Then .SetFocus

DoEvents

If .Row < .Rows - 1 Then ' 1つ下に移動 .Row = .Row + 1 End If End If ' →移動を選択の場合(デフォルト) If NextCell = 0 Then .SetFocus DoEvents ' 右端に行った場合の折り返し処理

If .Col = .Cols - 1 And .Row < .Rows - 1 Then .Row = .Row + 1

.Col = 0 End If

' 1つ右に移動

If .Col < .Cols - 1 Then .Col = .Col + 1 End If

(4)

Case vbKeyUp ' ↑キー。 .SetFocus

DoEvents

If .Row > .FixedRows Then .Row = .Row - 1

End If

Case vbKeyDown ' ↓キー。 .SetFocus

DoEvents

If .Row < .Rows - 1 Then .Row = .Row + 1 End If

End Select End With End Sub

Private Sub MSFlexGrid1_GotFocus() If Text1.Visible = False Then Exit Sub

' セルからフォーカスが移動した時にテキストボックスの ' データーをセルにコピーしテキストボックスを非表示に設定 MSFlexGrid1 = Text1

Text1.Visible = False End Sub

Private Sub MSFlexGrid1_LeaveCell() If Text1.Visible = False Then Exit Sub

' セルからフォーカスが移動した時にテキストボックスの ' データーをセルにコピーしテキストボックスを非表示に設定 MSFlexGrid1 = Text1 Text1.Visible = False End Sub 5.以上で、入力・編集・フォーカス移動が可能と成る。引き続き下記のコードを記述する。 ' 漢字キーが押された状態での入力が出来ない為の処理

Private Sub MSFlexGrid1_KeyDown(KeyCode As Integer, Shift As Integer)

If KeyCode > 127 Or KeyCode = vbKeyF2 Then ' 漢字、及び、F2 キーの場合 Call MSFGEdit(MSFlexGrid1, Text1, vbKeySpace) ' 空白を代入する。

End If End Sub

6.↓移動と→移動のメニューを作成する Private Sub mnuDown_Click()

' Enter 入力の後、下方向に移動(Excel と同様の操作に) NextCell = 1

End Sub

Private Sub mnuRight_Click() ' Enter 入力の後、右方向に移動 NextCell = 0

(5)

7.タブキーに依るフォーカス移動の設定を行う。

タブキーでの移動が出来ない為、別途ダミーのテキストボックスを2個、見え無い処に配置して置く。猶、動き

が逆の場合は、TabIndex の番号を入れ替える等の処理を施す。

Private Sub Text2_GotFocus() ' タブキーに依る右移動 With MSFlexGrid1 If .Col < .Cols - 1 Then .Col = .Col + 1

ElseIf .Row < .Rows - 1 Then .Row = .Row + 1 .Col = 1 End If DoEvents .SetFocus End With End Sub

Private Sub Text3_GotFocus() ' シフトキ+タブキーに依る左移動 With MSFlexGrid1

If .Col > 1 Then .Col = .Col - 1 ElseIf .Row > 1 Then .Row = .Row - 1 .Col = .Cols - 1 End If DoEvents .SetFocus End With End Sub 猶、フォームに色々コントロールが貼り付けて有る場合は旨く動か無い事が有る。別途API を使用した方法を試 す必要が有る。 ■ 各セル個別に ToolTipText を表示する

MSFlexGrid の ToolTipText は1個しか表示する事が出来ない。其処で、MouseMove イベントと配列データー を使用して実現する。

猶、データー部分等は、各自の環境に依り、シーケンシャルファイルで作成し、起動時に配列に読込だりして使 用する。例えば、前回の成績を読込んで置けば、今回の成績と比較が簡単に出来たりする。

Option Explicit

Private TTTShowFlag As Boolean ' ツールチップ表示フラグ(宣言セクションに記入) Private Msg(9, 7) As String ' ツールチップ表示テキスト

(6)

Private Form_Load() Dim I As Integer Dim J As Integer ' 表示用データーを作成 For I = 0 To 9 For J = 0 To 7

Msg(I, J) = I & "行目の" & J & "列目のセル" Next J

Next I End Sub

Private Sub Command5_Click() ' フラグ(True 又は False)の設定 TTTShowFlag = Not TTTShowFlag End Sub

Private Sub MSFlexGrid1_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single) ' MSFlexGrid のセル個別に ToolTipText を設定表示

If TTTShowFlag = True Then Dim R As Integer Dim C As Integer ' マウス位置の読み込み R = MSFlexGrid1.MouseRow C = MSFlexGrid1.MouseCol ' 該当セルとデーターの照合

If MSFlexGrid1.MouseRow = R And MSFlexGrid1.MouseCol = C Then '該当セルに ToolTipText を表示 MSFlexGrid1.ToolTipText = Msg(R, C) End If Else MSFlexGrid1.ToolTipText = "" End If End Sub ■ 複数の任意のデータを任意の場所に貼付け 複数の任意の場所のデータを任意の位置に貼付ける方法は、下記の通りで有る。 ・Ctrl キーを押しクリックした位置のセルを反転色にする。 ・反転色のセルのデータを変数に代入する。 ・貼付け位置を指定し、貼付けボタンをクリックする事で1個宛任意の位置に貼付ける。 但し、此の方法は全部のセルを参照する為、データ数が多いと効率が悪く成る。クリックした位置丈調べる方法 も考えたが、クリックした順番にしか貼付けが出来ず今回の方法に仕た。セル数が5000 位迄なら、此れでも充 分実用的で有る。 下記のコードを、宣言セクションに記述する。 Option Explicit

Dim KeyCtrl As Boolean ' Ctrl キーが押されて居るかの判定 Dim SelDatCount As Long ' セルデータのカウント

(7)

Dim MyRow As Long ' Row 位置取得 Dim MyCol As Long ' Col 位置取得

Dim SelCopyCount As Long ' セルへのコピー数のカウント 下記のコードを、各イベントに記述する。

Private Sub Form_Load() Dim i As Long Dim j As Long Dim n As Long ' ダミーのデータを表示 With MSFlexGrid1 .Rows = 15 .Cols = 10 ' 表示を早くする為に一旦非表示に設定 .Visible = False .RowHeight(-1) = 350 ' 固定行は除く

For i = .FixedRows To .Rows - .FixedRows - 8 ' 固定列は除く

For j = .FixedCols To .Cols - .FixedCols - 5 .Col = j .Row = i n = n + 1 .Text = n Next j Next i .Visible = True End With End Sub ' クリックしたセルを強調表示 Private Sub MSFlexGrid1_Click() With MSFlexGrid1

' クリック位置を取得 MyRow = .Row MyCol = .Col

If KeyCtrl = True Then

If .CellBackColor = QBColor(1) Then ' 再クリックした場合セル色を元に .CellBackColor = QBColor(15) .CellForeColor = QBColor(0) Else ' セルに反転色を指定 .CellBackColor = QBColor(1) .CellForeColor = QBColor(15) End If End If End With End Sub ' Ctrl キーの押下げを取得

Private Sub MSFlexGrid1_KeyDown(KeyCode As Integer, Shift As Integer) If Shift = vbCtrlMask Then

KeyCtrl = True ' Ctrl キーが押された SelDatCount = 0

(8)

Else

KeyCtrl = False End If

End Sub

Private Sub MSFlexGrid1_KeyUp(KeyCode As Integer, Shift As Integer) ' Ctrl キーを放した

If KeyCtrl = True Then KeyCtrl = False If SelDatCount = 0 Then ' データをコピーする SubDatCopy End If End If End Sub ' 強調表示のセルを探し、其のセルの中身を配列に読み込み Private Sub SubDatCopy()

Dim i As Integer Dim j As Integer SelDatCount = 0

ReDim Preserve SelDat(SelDatCount) As Variant ' 表示を早くする為に一旦非表示に設定

With MSFlexGrid1 .Visible = False ' 固定行は除く

For i = .FixedRows To .Rows - .FixedRows ' 固定列は除く

For j = .FixedCols To .Cols - .FixedCols .Col = j

.Row = i

' 反転色のセルを探す

If .CellBackColor = QBColor(1) Then SelDatCount = SelDatCount + 1 ' 配列を1個宛増やす

ReDim Preserve SelDat(SelDatCount) As Variant ' 又はコピー先を指定して直接コピー ' 行の左から右への順に変数に代入 SelDat(SelDatCount) = .Text ' セルの色を元に戻す .CellBackColor = QBColor(15) .CellForeColor = QBColor(1) End If Next j Next i .Visible = True End With End Sub ' クリックされた位置に配列の中身を表示 Private Sub Command1_Click()

' データが無い場合

If SelDatCount = 0 Then Exit Sub ' 貼付け件数をカウント

SelCopyCount = SelCopyCount + 1 If SelCopyCount > SelDatCount Then ' 全部貼り付けた場合

(9)

SelDatCount = 0 ReDim SelDat(0) Exit Sub End If With MSFlexGrid1 ' クリック位置に貼付け .Row = MyRow .Col = MyCol .Text = SelDat(SelCopyCount) End With End Sub ■ グリッドに表示出来る行数を取得する スクロールの方法とグリッドに一度に表示する事の出来る最大行数を取得する関数を下記に示す。機能は下記の 通りで有る。 ・グリッドの内容の変更が可能 ・エンターキーでの移動が可能 ・直接文字を入力すると上書きモード ・エンターかマウスのダブルクリックで、挿入モード ・自動でスクロール。

Private Sub Text1_KeyPress(KeyAscii As Integer) Dim Total As Single

Dim Average As Single If KeyAscii = 13 Then KeyAscii = 0

MSFlexGrid1.Text = text1.Text

If MSFlexGrid1.Row = MSFlexGrid1.Rows - 1 And MSFlexGrid1.Col = MSFlexGrid1.Cols - 1 Then ' 最後の行に成れば最初の行へ移動

MSFlexGrid1.Row = MSFlexGrid1.FixedRows MSFlexGrid1.Col = MSFlexGrid1.FixedCols MSFlexGrid1.TopRow = MSFlexGrid1.FixedRows MSFlexGrid1.LeftCol = MSFlexGrid1.FixedCols ElseIf MSFlexGrid1.Col = MSFlexGrid1.Cols - 1 Then ' 次の行の先頭へ折り返す

MSFlexGrid1.Row = MSFlexGrid1.Row + 1 MSFlexGrid1.Col = MSFlexGrid1.FixedCols MSFlexGrid1.LeftCol = MSFlexGrid1.FixedCols

If MSFlexGrid1.Row >= VisibleRows(MSFlexGrid1) Then ' 行のスクロール

MSFlexGrid1.TopRow = MSFlexGrid1.TopRow + 1 End If

Else

If MSFlexGrid1.Col >= VisibleCols(MSFlexGrid1) Then ' 列のスクロール MSFlexGrid1.LeftCol = MSFlexGrid1.LeftCol + 1 End If ' セルを1つ移動 MSFlexGrid1.Col = MSFlexGrid1.Col + 1 text1.Visible = True text1.SetFocus 'MSFlexGrid1.SetFocus

(10)

End If MSFlexGrid1.Text = text1.Text text1.Text = "" End If End Sub ' グリッドに一度に表示出来る最大行数を返す。

Public Function VisibleRows(grdName As MSFlexGrid) Dim lngUsingRows As Long

For Cnt_Rows = 0 To grdName.Rows - 1

lngUsingRows = lngUsingRows + grdName.RowHeight(Cnt_Rows)

If grdName.Height <= lngUsingRows Then = Cnt_Rows - grdName.FixedRows - 1 Exit For Else VisibleRows = grdName.Rows End If Next Cnt_Rows End Function ' グリッドに一度に表示出来る最大列数を返す。 Public Function VisibleCols(grdName As MSFlexGrid) Dim lngUsingCols As Long

For Cnt_Cols = 0 To grdName.Cols - 1

lngUsingCols = lngUsingCols + grdName.ColWidth(Cnt_Cols) If grdName.Width <= lngUsingCols Then

VisibleCols = Cnt_Cols - grdName.FixedCols Exit For Else VisibleCols = grdName.Cols End If Next Cnt_Cols End Function ■ 列の挿入、及び、削除 ' 列のインサート

Private Sub Command8_Click()

Call sInsertCol(3, 1000) ' 3 列目に幅 1000 の列を挿入 End Sub

Private Sub sInsertCol(InsCol As Long, ColWid As Long) Dim i As Long Dim j As Long With MSFlexGrid1 .Visible = False .ColWidth(InsCol) = ColWid .Cols = .Cols + 1 '1列増やす ' 此の様に必要に依り隣のセルの情報を引き継ぐ .ColWidth(.Cols - 1) = .ColWidth(.Cols - 2) For i = 0 To .Rows - 1 .Row = i

For j = .Cols - 1 To InsCol Step -1 ' 挿入列以降のデータを移動 ' データを移動

.TextMatrix(i, j) = .TextMatrix(i, j - 1) If j = InsCol Then

(11)

.TextMatrix(i, j) = "" ' 挿入列のデータを Null に設定 End If Next j Next i .Visible = True End With End Sub ' 列の削除

Private Sub Command9_Click()

Call sDeleteCol(3) ' 3列目を削除 End Sub

Private Sub sDeleteCol(DelCol As Long) Dim i As Long Dim j As Long With MSFlexGrid1 .Visible = False For i = 0 To .Rows - 1 .Row = i

For j = DelCol + 1 To .Cols - 1 ' 削除列以降のデータを移動 .TextMatrix(i, j - 1) = .TextMatrix(i, j) Next j Next i .Cols = .Cols - 1 .Visible = True End With End Sub ' 列の入れ替え

Private Sub Command12_Click()

Call sSwapCol(3, 5) ' 3列目と5列目を入替える End Sub

Private Sub sSwapCol(SwapCol1 As Long, SwapCol2 As Long) Dim i As Long

Dim ColData As Variant With MSFlexGrid1 .Visible = False

'.ColWidth(InsCol) = ColWid For i = 0 To .Rows - 1 ' データを退避

ColData = .TextMatrix(i, SwapCol1) ' データを移動

.TextMatrix(i, SwapCol1) = .TextMatrix(i, SwapCol2) '退 避して置いたデータを移し変え

.TextMatrix(i, SwapCol2) = ColData Next i .Visible = True End With End Sub セル内の書式等は考慮して居ない。亦、最終列の削除等のエラー処理はして居ない。各自の環境に合せて作り直 す必要が有る。

(12)

■ MSFlexGrid のカラー印刷 Private Sub Command10_Click() Dim frmLeft As Long

Dim frmTop As Long Dim frmWidth As Long Dim frmHeight As Long Dim frmbakcol As Long Dim mfgLeft As Long Dim mfgTop As Long Dim mfgWidth As Long Dim mfgHeight As Long ' 元の位置とサイズを取得 With Form1 frmbakcol = .BackColor frmLeft = .Left frmTop = .Top frmWidth = .Width frmHeight = .Height ' フォームをグリッドの大きさに合せる

.Move 0, 0, MSFlexGrid1.Width + 150, MSFlexGrid1.Height + 850 .BackColor = QBColor(15) End With With MSFlexGrid1 mfgLeft = .Left mfgTop = .Top mfgWidth = .Width mfgHeight = .Height ' 表示位置を左上に .Move 0, 0 End With DoEvents ' 画面、フォーム、ウインドウを取り込んで印刷する方法 With Picture1 .AutoSize = True .AutoRedraw = True

Set .Picture = CaptureClient(Me) Call sPrint

.AutoRedraw = False End With

DoEvents

' 元の位置とサイズに戻す

Form1.Move frmLeft, frmTop, frmWidth, frmHeight

MSFlexGrid1.Move mfgLeft, mfgTop, mfgWidth, mfgHeight Form1.BackColor = frmbakcol

DoEvents End Sub

Private Sub sPrint() On Error Resume Next Dim lngHeight As Long Dim lngWidth As Long Dim sngHZoomRitu As Single Dim sngWZoomRitu As Single Picture1.ScaleMode = vbTwips Printer.ScaleMode = vbTwips

(13)

' 用紙サイズをA4に設定 Printer.PaperSize = vbPRPSA4 ' 用紙方向を横向きに設定 Printer.Orientation = vbPRORLandscape ' Image ファイルの寸法を取得 lngHeight = Picture1.Height lngWidth = Picture1.Width ' 印刷サイズより画像サイズが大きい場合而巳縮小

If lngHeight > Printer.Height - 1100 Or lngWidth > Printer.Width - 1800 Then ' 拡大・縮小率を計算

sngHZoomRitu = (Printer.Height - 1100) / lngHeight sngWZoomRitu = (Printer.Width - 1800) / lngWidth ' 元のサイズの縦横比で用紙一杯に拡大・縮小 If sngHZoomRitu < sngWZoomRitu Then lngHeight = lngHeight * sngHZoomRitu lngWidth = lngWidth * sngHZoomRitu Else

lngHeight = lngHeight * sngWZoomRitu lngWidth = lngWidth * sngWZoomRitu End If

End If

Printer.PaintPicture Picture1.Image, 800, 400, lngWidth, lngHeight Printer.EndDoc ' 印刷開始

End Sub

■ MSFlexGrid のカラー印刷(Picture に表示して Picture を印刷)其の2

MSFlexGrid1.Picture を使用する事で MSFlexGrid のスナップショットが取れる。其れをクリップボードや Picture コントロールに設定する事で簡単に印刷する事が出来る(VB5.0、VB6.0 で可能で有る)。

Private Sub Command11_Click() With MSFlexGrid1 .TopRow = .FixedRows ' 用紙に入ら無い場合は、此処を変更して2枚目に印刷する .LeftCol = .FixedCols .PictureType = flexPictureColor ' 高品質のカラー End With With Picture1 .AutoSize = True .AutoRedraw = True ' Picture コントロールへ MSFlexGrid1 のスナップショットを送る .Picture = MSFlexGrid1.Picture

(14)

Printer.EndDoc .AutoRedraw = False End With End Sub 上記の孰れの方法も画面イメージを印刷して居る。従って、文字等は綺麗に印刷されないし、画像と仕ての印刷 設定しか出来ない。綺麗に印字し度い場合や細かい設定で印刷し度い場合は、データーを印字する(罫線・改ペ ージ処理含む)の様に地道にコードを記述する必要が有る。 ■ ワードラップ時に行の高さを自動調整 Option Explicit

Private Sub Form_Load()

With lblTemp ' ラベルを見え無い位置に配置 .AutoSize = True .WordWrap = True .Visible = False End With Form1.Move 0, 0, 7400, 4000 ' MSFlexGrid の初期設定 With MSFlexGrid1 .Move 200, 200, 6800, 2600 .Rows = 8 ' 行の総数(固定行含む) .Cols = 6 ' 列の総数(固定列含む) .WordWrap = True .AllowUserResizing = flexResizeBoth .FixedRows = 1 ' 固定行の数(Rows より1以上尐ない事) .FixedCols = 1 ' 固定列の数(Cols より1以上尐ない事) .TextMatrix(1, 1) = "あいうえ A" .TextMatrix(2, 2) = "あいうえお"

.TextMatrix(3, 3) = "あいうえお kakiku keko" .TextMatrix(4, 4) = "あいうえおさしすせそ" End With

End Sub

Private Sub Command1_Click()

' 総てのセルの高さを自動調整する場合 Call AutoCellHeight(0, 0)

End Sub

Private Sub Command2_Click() ' 標準の高さに設定

MSFlexGrid1.RowHeight(-1) = -1 End Sub

Private Sub MSFlexGrid1_DblClick() With MSFlexGrid1

Call AutoCellHeight(.Row, .Col) End With

End Sub

Private Sub AutoCellHeight(MyRow As Long, MyCol As Long) Dim RowStrt As Long ' スタートの列 Dim RowEnd As Long ' 終りの列

(15)

Dim i As Long, j As Long ' ループ用のカウンタ Dim TxtHeight As Long ' 文字の高さ

Dim NewHeight As Long ' 変更後のセルの高さ With MSFlexGrid1 .Visible = False ' 非表示に(ちらつき防止・処理が早い) RowStrt = MyRow ' 個別か全体化を判断 RowEnd = MyRow If MyRow = 0 Then ' 全体の設定の場合 RowStrt = 0 RowEnd = .Rows - 1 End If

For i = RowStrt To RowEnd NewHeight = 0

For j = 0& To .Cols - 1 ' 其の行内で一番高いセルを取得 .Row = i .Col = j ' セルとラベルのフォントを同じに設定 lblTemp.FontSize = .CellFontSize lblTemp.FontName = .CellFontName lblTemp.FontBold = .CellFontBold lblTemp.FontItalic = .CellFontItalic ' ラベルに文字列を設定して高さを取得 lblTemp.Caption = .TextMatrix(i, j) lblTemp.Width = .ColWidth(j) - 90 TxtHeight = lblTemp.Height ' 折返しを含めた高さを取得 If NewHeight < TxtHeight Then

NewHeight = TxtHeight ' 行内で一番高いセルの高さを取得 End If

Next j

.RowHeight(i) = NewHeight + 40 ' 余白分をプラスして設定 Next i

If MyCol = 0 And MyRow = 0 Then ' ホームポジションへ移動 .Col = .FixedCols .Row = .FixedRows Else .Row = MyRow ' 元のセル位置に移動 .Col = MyCol - 1 End If .Visible = True End With End Sub lblTemp と名付けたラ ベルコントロールを1 個見え無い所にでも配 置して置く。セルの内 容をラベルに表示して、 其の時にラベルのサイ ズをセルに設定する事 で実現して居る。

(16)

APIを使った同様のサンプル

別途同様にラベルとテキストボックスが必要で有る。 Option Explicit

' 指定のウインドウにメッセージを送る API

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA"

(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long ' テキストの行数を取得する定数

Private Const EM_GETLINECOUNT = &HBA Private Sub Form_Load()

With txtTemp ' テキストボックスを見え無い位置に配置 '.MultiLine = True ' 別途プロパティで設定して置く .Visible = False End With With lblTemp ' ラベルを見え無い位置に配置 .AutoSize = True .Visible = False End With Form1.Move 0, 0, 7400, 4000 'MSFlexGrid の初期設定 With MSFlexGrid1 .Move 200, 200, 6800, 2600 .Rows = 8 ' 行の総数(固定行含む) .Cols = 6 ' 列の総数(固定列含む) .WordWrap = True .AllowUserResizing = flexResizeBoth .FixedRows = 1 ' 固定行の数(Rows より1以上尐ない事) .FixedCols = 1 ' 固定列の数(Cols より1以上尐ない事) .TextMatrix(1, 1) = "あいうえ A" .TextMatrix(2, 2) = "あいうえお"

.TextMatrix(3, 3) = "あいうえお kakiku keko" .TextMatrix(4, 4) = "あいうえおさしすせそ" End With

End Sub

Private Sub MSFlexGrid1_DblClick() With MSFlexGrid1

Call AutoCellHeight(.Row, .Col) End With

End Sub

Private Sub Command1_Click()

' 総てのセルの高さを自動調整する場合 ' 起動時データを読込んで表示する場合に Call AutoCellHeight(0, 0)

End Sub

Private Sub Command2_Click() ' 標準の高さに設定

MSFlexGrid1.RowHeight(-1) = -1 End Sub

(17)

Dim RowStrt As Long ' スタートの列 Dim RowEnd As Long ' 終りの列 Dim i As Long

Dim j As Long

Dim OldHeight As Long ' 文字の高さ Dim TxtHeight As Long ' 文字の高さ

Dim NewHeight As Long ' 変更後のセルの高さ Dim textLine As Long ' ワードラップ後の行数 With MSFlexGrid1 .Visible = False ' 非表示に(ちらつき防止・処理が早い) RowStrt = MyRow ' 個別か全体化を判断 RowEnd = MyRow If MyRow = 0 Then ' 全体の設定の場合 RowStrt = 0 RowEnd = .Rows - 1 End If

For i = RowStrt To RowEnd NewHeight = 0

For j = 0& To .Cols - 1 ' 其の行内で一番高いセルを取得 .Row = i .Col = j ' セルのフォントとテキストボックスのフォントを同じに設定 txtTemp.FontSize = .CellFontSize txtTemp.FontName = .CellFontName txtTemp.FontBold = .CellFontBold txtTemp.FontBold = .CellFontItalic ' セルの幅とテキストボックスの幅を同じに設定 txtTemp.Width = .ColWidth(j) lblTemp.FontSize = .CellFontSize txtTemp.Text = .TextMatrix(i, j) lblTemp.Caption = .TextMatrix(i, j) OldHeight = lblTemp.Height ' 文字の高さを取得

textLine = SendMessage(txtTemp.hwnd, EM_GETLINECOUNT, 0&, 0&) TxtHeight = textLine * OldHeight

If NewHeight < TxtHeight Then

NewHeight = TxtHeight ' 行内で一番高いセルの高さを取得 End If

Next j

.RowHeight(i) = NewHeight + 40 ' 余白分をプラスして設定 Next i

If MyCol = 0 And MyRow = 0 Then ' ホームポジションへ移動 .Col = .FixedCols .Row = .FixedRows Else .Row = MyRow ' 元のセル位置に移動 .Col = MyCol - 1 End If .Visible = True End With End Sub 此方は、セルの内容をテキストボックスに表示し、API を使用してテキストボックスの行数を求め、セルの高さ を設定して居る。孰れのサンプルも一つのセルの内容を変更すれば、其の行の総ての列のセルの内容を調べ、一 番行が高い値に設定して居る。然うで無いと、高く変更された場合は、問題無いが、低く変更された場合は、何 の列のセルが一番高いか調査し直さなければ、低く変更出来ないからで有る

(18)

■ MSFlexGrid のセル内を検索する Option Explicit

' 完全一致検索

Private Sub Command1_Click() Dim Ro As Long

Dim Co As Long Dim Ret As Long With MSFlexGrid1

For Ro = .FixedRows To .Rows - 1 For Co = .FixedCols To .Cols - 1

If Text1.Text = .TextMatrix(Ro, Co) Then .Col = Co

.Row = Ro .TopRow = Ro

Ret = MsgBox("此れですか", vbYesNo) If Ret = vbYes Then

Exit Sub End If End If Next Co Next Ro End With End Sub ' 前方一致検索

Private Sub Command2_Click() Dim Ro As Long

Dim Co As Long Dim Ret As Long With MSFlexGrid1

For Ro = .FixedRows To .Rows - 1 For Co = .FixedCols To .Cols - 1

If InStr(.TextMatrix(Ro, Co), Text1.Text) Then .Col = Co

.Row = Ro .TopRow = Ro

Ret = MsgBox("此れですか", vbYesNo) If Ret = vbYes Then

Exit Sub End If End If Next Co Next Ro End With End Sub

(19)

■ Excel ファイルを MSFlexGrid に表示(DAO を利用)

参照設定でMicrosoft DAO 3.6 Object Library にチェックを入れて置き、フォームに MSFlexGrid コントロール とデータコントロールを貼り付けて、デザイン時に下記プロパテイをセットして置く。

MSFlexGrid1.DataSource = Data1 Data1.Visible = False

Option Explicit

Private Sub Command1_Click() Dim DB As Database

Dim RS As Recordset Dim FileName As String MSFlexGrid1.Visible = False

' 読込用の Excel ファイル(パスを間違え無い様に) FileName = App.Path & "¥test.xls"

' ファイルをオープン(HDR=NO で項目を読み込まない様にする事も可能) Set DB = OpenDatabase(FileName, False, False, "Excel 8.0;HDR=YES;") ' テーブルの内容を格納(Sheet1 = Excel のシート名)

Set RS = DB.OpenRecordset("Sheet1$", dbOpenTable) ' MSFlexGrid と連結 Set Data1.Recordset = RS Data1.Refresh RS.Close DB.Close Set DB = Nothing Set RS = Nothing ' 参考:下記の部分の表示は 0.05 秒位 Dim i As Long With MSFlexGrid1 For i = 1 To .Rows - 1 .TextMatrix(i, 0) = i Next i End With MSFlexGrid1.Visible = True End Sub

WinXP AMD Duron 950MHz 256MBのマシンで5000行の8列のファイルの読込表示にMSFlexGridを非表示

で1.7 秒、表示状態で 3.1 秒と結構早く読み込める。因みに同じファイルを CSV 形式でシーケンシャルアクセス

モードでファイルを開くと、非表示状態でも8.0 秒懸かる。其の CSV ファイルを DAO を使用して読み込み表示

すると4 秒で表示する事が出来た。猶、コード中の "Excel 8.0;HDR=NO;" の Excel 8.0 は使用して居る Excel

のバージョンとは関係無い。特にExcel が導入されて居ない環境でも動作する筈で有る。

但し、読み込むデータに尐し制限が有る。デフォルトでは8行目迄のデータで多い方のデータ型で設定する。オ プション機能のIMEX=1; を追加して "Excel 8.0;HDR=YES;IMEX=1;" とすれば8行目迄のデータが同一カラ ム(列)内に混在して居る場合、テキスト型として扱う。従って、其の様な可能性が有るカラムには1行目に文 字列を入力して置くとか、項目名を必要なデータ型で作成するとか、項目を読み込まないとか、レジストリでデ フォルトの8行の設定を変更する等で対処する。

(20)

■ ADO を使用して CSV ファイルを読込

ADO を使用して CSV ファイルを MSHFlexGrid に表示するコード例を下記に示す。

先ず、参照設定でMicrosoft ActiveX Data Objects 2.5 Libraryにチェックを入れて置き、FormにMSHFlexGrid1

とCommand1 を貼り付けて置く。亦、カンマ区切りの Test.csv ファイルをプログラムと同じフォルダに準備し

て置く。

Option Explicit

Private Sub Command1_Click()

Dim CN As New ADODB.Connection Dim RS As New ADODB.Recordset

Dim FolderName As String, txtDRIVER As String Dim DataFile As String, strSQL As String Dim strProvider As String

Screen.MousePointer = vbHourglass MSHFlexGrid1.Clear DoEvents FolderName = App.Path ' データの有るフォルダを取得 DataFile = "Test.csv" ' データファイル名を取得 ' データベースに接続する為の情報を設定する

strProvider = "Provider=MSDASQL;Extended Properties=""" txtDRIVER = "DRIVER={Microsoft Text Driver (*.txt; *.csv)};DBQ=" CN.ConnectionString = strProvider & txtDRIVER & FolderName & """" ' コネクションをオープン

CN.Open

' Recordset オブジェクトのオープン strSQL = "Select * From " & DataFile

RS.Open strSQL, CN, adOpenStatic, adLockReadOnly, adCmdText Set MSHFlexGrid1.DataSource = RS ' MSHFlexGrid にデータを代入 ' Recordset・Connection を閉じる RS.Close CN.Close ' 参照を解放。 Set RS = Nothing Set CN = Nothing Screen.MousePointer = vbDefault End Sub ODBC 接続 Provider=MSDASQL 使用するデータベースの種類

Extended Properties="" ODBC ドライバーの為の設定は、Extended Properties = に 一括して与える。此等を一纏めにする為に、" (ダブルコーテー ション)が利用される。上記のコードでは、文字列の中に入る " をエスケープする為に二重に記述して居る"

DRIVER={Microsoft Text Driver (*.txt; *.csv)} ODBC ドライバ名

DBQ=FolderName ODBC ドライバを使用して接続するデータベースファイル名

(フォルダ名)

(21)

User ID データベースに接続する時に使用するユーザ名 Password データベースに接続する時に使うパスワード FILE NAME データベースへの接続情報指定したデータリンクファイル名 DSN データベースへの接続情報指定したODBC データソース名 Location 接続先のサーバー名 Open メソッド

構文:Recordset.Open Source, ActiveConnection, CursorType, LockType, Options 例文:RS.Open strSQL, CN, adOpenStatic, adLockReadOnly, adCmdText Recordset: Recordset オブジェクトを表すオブジェクト変数 (RS) Source: 省略可能で有る。データを取得するテーブル名又はSQL ステートメント ActiveConnection: 省略可能で有る。接続中のデータベースを表すオブジェクト変数 (CN) CursorType: 省略可能で有る。カーソルタイプ(下記定数より選択) 定数 説明 adOpenForwardOnly デフォルトの値で有る。前方スクロールタイプカーソルを開く。 adOpenKeyset キーセットカーソルを開く。 adOpenDynamic 動的カーソルを開く。 adOpenStatic 静的カーソルを開く。 LockType: 省略可能で有る。ロックタイプ(下記定数より選択) 定数 説明 adLockReadOnly デフォルトの値で有る。読み取り専用(データの変更は出来ない)。 adLockPessimistic レコード毎の排他的ロック(通常、編集の際にプロバイダがデータソース でレコードをロックする事に依り、確実にレコードを編集出来る為に必要 な最小限のロックを使用する)。 adLockOptimistic レコード毎の共有的ロック(Update メソッドを呼び出した場合而巳、プ ロバイダが共有的ロックを使用してレコードをロックする)。 adLockBatchOptimistic 共有的バッチ更新(即時更新モードに対して、バッチ更新モードの場合に 必要で有る)。

Options: 省略可能で有る。Source 引数が Command オブジェクト以外の設定値を表す場合、又は、

以前に保存して居たファイルからRecordset を復元する場合に、プロバイダが引数を評価

する方法を示す IMEX=

0 is Export mode 1 is Import mode

(22)

■ 相対的位置関係で貼付

MSFlexGrid でコピーしたセルの相対的位置関係で貼付けるコード例を下記に示す。

Form に MSFlexGrid1 を 1 個と CommandButton を3個(cmdExit、cmdCopy、Mpaste)を貼り付けて置く。 Option Explicit

Private KeyCtrl As Boolean ' Ctrl キーが押されて居るかの判定 Private KeyClip As Boolean ' Shift キーが押されて居るかの判定 Private SelDatCount As Long ' セルデータのカウント

Private SelCopyCount As Long ' コピーした数のカウント Private PosiRow() As Integer ' コピーしたセルの Row Private PosiCol() As Integer ' コピーしたセルの Col Private SelDat() As Variant ' セルの内容取得用

Private strClip As String ' Clip プロパティ用の文字列格納用の変数 Private R1 As Integer ' 範囲選択用の Row 用

Private R2 As Integer ' 範囲選択用の RowSel 用 Private C1 As Integer ' 範囲選択用の Col 用 Private C2 As Integer ' 範囲選択用の ColSel 用

Private CopyMode As Boolean ' Copy ボタンクリック時のフラグ(True:Click) Private Sub SPasteClip()

On Error Resume Next

Dim nowRow As Integer ' 現時選択されて居る行 Dim nowCol As Integer ' 現在選択されて居る列 '連続した範囲をペーストする With MSFlexGrid1 nowRow = .Row nowCol = .Col If R1 = R2 Then .Row = nowRow .Col = nowCol .RowSel = nowRow .ColSel = C2 .Clip = strClip Else .Row = nowRow .Col = nowCol .RowSel = R1 + nowRow .ColSel = C2 .Clip = strClip End If End With KeyClip = False End Sub

Private Sub cmdExit_Click() Unload Me

End Sub

Private Sub cmdCopy_Click() CopyMode = True

SubDatCopy End Sub

(23)

Private Sub Form_Load() With MSFlexGrid1 .Rows = 14 .Cols = 7 .TextMatrix(1, 1) = "うし" .TextMatrix(1, 2) = "うま" .TextMatrix(1, 3) = "ぶた" .TextMatrix(2, 1) = "しまりす" .TextMatrix(2, 4) = "ひつじ" .TextMatrix(3, 3) = "くま" .RowHeight(-1) = 350 End With KeyCtrl = False KeyClip = False CopyMode = False End Sub ' 貼付け先のセルをクリックして、貼付ボタンをクリックする事で任意の場所に次々貼付け出来る。 Private Sub Mpaste_Click()

Dim myRow As Integer Dim myCol As Integer Dim I As Integer CopyMode = False If KeyClip = True Then SPasteClip

KeyClip = False GoTo Owari

ElseIf KeyCtrl = True Then

' 今選択されて居るポジションを取得して置く With MSFlexGrid1 myRow = .Row myCol = .Col End With If SelDatCount = 0 Then KeyCtrl = False GoTo Owari End If

On Error GoTo Owari With MSFlexGrid1 For I = 1 To SelDatCount If I = 1 Then .Row = myRow .Col = myCol .Text = SelDat(I) Else

.Row = PosiRow(I) - PosiRow(1) + myRow .Col = PosiCol(I) - PosiCol(1) + myCol .CellBackColor = QBColor(15) .CellForeColor = QBColor(0) .Text = SelDat(I) End If Next I .Row = myRow .Col = myCol .CellBackColor = QBColor(15) .CellForeColor = QBColor(0) End With

(24)

KeyCtrl = False End If CopyMode = False Exit Sub Owari: For I = 1 To SelDatCount PosiRow(I) = 0 PosiCol(I) = 0 ReDim SelDat(0) KeyCtrl = False CopyMode = False Next I

Select Case Err.Number Case 30009, 30010 Dim msg As String msg = "コピーの範囲が、セルの外に出て仕舞います。" MsgBox msg End Select End Sub

Private Sub MSFlexGrid1_Click() If KeyCtrl = True Then

With MSFlexGrid1

If .CellBackColor = QBColor(1) Then ' 再クリックした場合セル色を元に .CellBackColor = QBColor(15) .CellForeColor = QBColor(0) Else ' セルに反転色を指定 .CellBackColor = QBColor(1) .CellForeColor = QBColor(15) End If End With End If End Sub

Private Sub SubDatCopy() Dim I As Integer

Dim J As Integer If KeyCtrl = True Then SelCopyCount = 0 SelDatCount = 0 ' 表示を早くする為に一旦非表示に設定 With MSFlexGrid1 .Visible = False ' 固定列は除く

For I = .FixedCols To .Cols - .FixedCols ' 固定行は除く

For J = .FixedRows To .Rows - .FixedRows .Row = J

.Col = I

' 反転色のセルを探す

If .CellBackColor = QBColor(1) Then SelDatCount = SelDatCount + 1

' データ、セルの位置を変数に格納して置く ReDim Preserve SelDat(SelDatCount) As Variant

(25)

ReDim Preserve PosiRow(SelDatCount) As Integer ReDim Preserve PosiCol(SelDatCount) As Integer ' 位置 PosiRow(SelDatCount) = J PosiCol(SelDatCount) = I ' 又はコピー先を指定して直接コピー SelDat(SelDatCount) = .Text .CellBackColor = QBColor(15) .CellForeColor = QBColor(1) End If Next J Next I .Visible = True End With ' 連続セル(ドラッグに依る) ElseIf KeyClip = True Then With MSFlexGrid1 R1 = .Row R2 = .RowSel C1 = .Col C2 = .ColSel strClip = .Clip End With End If End Sub

Private Sub MSFlexGrid1_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single) If KeyCtrl = True Then

Exit Sub End If

' False の時は Shift を判断する If Shift = vbCtrlMask Then

KeyCtrl = True 'Ctrl キーが押された KeyClip = False Else KeyCtrl = False End If End Sub

Private Sub MSFlexGrid1_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single) ' ドラッグした時は、Clip で処理

If CopyMode = True Then Exit Sub

End If

If KeyCtrl = False Then KeyClip = True Else KeyClip = False End If End Sub 操作1:連続して無いセル(コピーしたセルの相対的位置関係で貼付けられる) 1.Ctrl キーを押し乍らクリックで選択(複数セル) 2.cmdCopy ボタンをクリック 3.貼り付けたい位置をクリック((セル而巳で良い) 4.Mpaste ボタンをクリック

(26)

操作2:連続したセル(コピーしたセルの相対的位置関係で貼付けられる) 1.コピーしたいセル範囲をドラッグで範囲選択 2.cmdCopy ボタンをクリック 3.貼り付けたい位置をクリック(1 セル而巳で良い) 4.Mpaste ボタンをクリック ■ MSFlexGrid でセルの塗り潰しパターンを実現 MSFlexGrid でセルの背景色の塗り潰しのパターンを設定するコード例を下記に示す。 Form に MSFlexGrid1 と Command1、Command2 を貼り付けて置く。

Option Explicit

Private Sub Form_Load()

' 初期設定(別途プロパティで設定出来る物は設定して置く) With MSFlexGrid1 .Cols = 10 .Rows = 6 .RowHeight(-1) = 350 .Font.Bold = True .TextMatrix(2, 2) = "先に記入" End With With Picture1 .AutoRedraw = True .Appearance = 0 .BorderStyle = vbBSNone .Visible = False End With End Sub ' パターンに依る塗り潰しのテスト Private Sub Command1_Click() Dim i As Long, Pt As Long With MSFlexGrid1

For i = .FixedCols To .Cols - 1 ' 1行総て表示 Call SetPattern(5, 2, i) If Pt < 8 Then ' 全パターン表示 Call SetPattern(Pt, 3, i) End If Pt = Pt + 1 Next i ' 表示してからセルにデータを表示した場合のテスト .TextMatrix(2, 4) = "後で記入" End With ' Row=4、Col=3 に VbCross(6-クロス)で表示 Call SetPattern(6, 4, 3) End Sub ' パターンを解除

Private Sub Command2_Click() Dim i As Long, Pt As Long With MSFlexGrid1

(27)

For i = .FixedCols To .Cols - 1 Call SetPattern(8, 2, i) If Pt < 8 Then Call SetPattern(8, 3, i) End If Pt = Pt + 1 Next i End With Call SetPattern(8, 4, 3) End Sub ' パターンの作成と塗り潰し処理 ' 用法:SetPattern(FiSty,Ro,Co) ' 引数:FiSty = Picture1.FillStyle(0 - 塗り潰し~7 - 網かけ迄、0~7 以外の場合は解除) ' Ro = Row、Co = Col

Private Sub SetPattern(ByVal FiSty As Integer, ByVal Ro As Long, ByVal Co As Long) With MSFlexGrid1 .Row = Ro .Col = Co Picture1.Cls ' ピクチャーのサイズをセルと同一に Picture1.Height = .CellHeight Picture1.Width = .CellWidth If FiSty >= 8 Or FiSty < 0 Then

' パターンの解除(Picture をクリア) Set .CellPicture = LoadPicture() Exit Sub

End If

' パターンの設定

Picture1.FillStyle = FiSty ' 枠の罫線が見え無い様に

Picture1.Line (-10, -10)-(.CellWidth, .CellHeight), QBColor(0), B ' セルにピクチャーを表示

Set .CellPicture = Picture1.Image End With

End Sub

MSFlexGrid では、バックカラーの設定でクロスや網掛けのハッチングが出来ない為、PictureBox を使用して実 現して居る。編集時や選択時で見辛ければ解除した方が良い。

(28)

■ 指定のセル範囲に罫線を設定

MSFlexGrid で指定のセル範囲に罫線を設定するコード例を下記に示す。

Form に MSFlexGrid1 と Command1、Picture1 を下図を参考に貼り付けて置く。 Option Explicit

' 初期設定(別途プロパティで設定出来る物は設定して置く) Private Sub Form_Load()

With MSFlexGrid1 .Cols = 10 .Rows = 10 .ColWidth(-1) = 1100 .RowHeight(-1) = 350 .Font.Bold = True .Col = 1: .Row = 2 .CellAlignment = flexAlignCenterCenter .TextMatrix(2, 1) = "先に記入" .Col = 3: .Row = 3 .CellAlignment = flexAlignCenterCenter .TextMatrix(3, 3) = "先に記入" .Col = 3: .Row = 5 .CellAlignment = flexAlignCenterCenter .TextMatrix(5, 3) = "先に記入" End With With Picture1 .AutoRedraw = True .Appearance = 0 .BorderStyle = vbBSNone .Visible = False End With End Sub

Private Sub Command1_Click() Call SetKeisen(0, 2, 1) ' 細枠 Call SetKeisen(1, 4, 1) ' 太枠 Call SetKeisen(2, 3, 3) ' 2重枠 Call SetKeisen(3, 5, 2) ' 複数列に太枠 Call SetKeisen(4, 5, 3) Call SetKeisen(5, 5, 4) Call SetKeisen(6, 2, 6) ' 複数行に太枠 Call SetKeisen(7, 3, 6) Call SetKeisen(7, 4, 6) Call SetKeisen(8, 5, 6) With MSFlexGrid1 .Col = 6: .Row = 3 .CellAlignment = flexAlignCenterCenter .TextMatrix(3, 6) = "後で記入" End With End Sub ' 色々な罫線の作成、及び、表示(後は此れを参考に作成する事)

(29)

Dim Wid As Long Dim Hei As Long With MSFlexGrid1 .Row = Ro .Col = Co Wid = .CellWidth Hei = .CellHeight Picture1.Cls ' ピクチャーのサイズをセルと同一に Picture1.Height = Hei Picture1.Width = Wid Select Case DrSty Case 0 ' 細枠

Picture1.Line (0, 0)-(Wid - 10, Hei - 10), QBColor(0), B Case 1 '太枠

Picture1.Line (0, 0)-(Wid - 10, Hei - 10), QBColor(0), B Picture1.Line (10, 10)-(Wid - 25, Hei - 25), QBColor(0), B Case 2 ' 2重枠

Picture1.Line (0, 0)-(Wid - 10, Hei - 10), QBColor(0), B Picture1.Line (30, 30)-(Wid - 45, Hei - 45), QBColor(0), B Case 3 ' 左側

Picture1.Line (0, 0)-(Wid, Hei - 10), QBColor(0), B Picture1.Line (10, 10)-(Wid + 10, Hei - 25), QBColor(0), B Case 4 ' 真中

Picture1.Line (-10, 0)-(Wid + 10, Hei - 10), QBColor(0), B Picture1.Line (-10, 10)-(Wid + 10, Hei - 25), QBColor(0), B Case 5 ' 右側

Picture1.Line (-10, 0)-(Wid - 10, Hei - 10), QBColor(0), B Picture1.Line (-10, 10)-(Wid - 25, Hei - 25), QBColor(0), B Case 6 ' 上側

Picture1.Line (0, 0)-(Wid - 10, Hei), QBColor(0), B Picture1.Line (10, 10)-(Wid - 25, Hei), QBColor(0), B Case 7 ' 中央

Picture1.Line (0, -10)-(Wid - 10, Hei), QBColor(0), B Picture1.Line (10, -10)-(Wid - 25, Hei), QBColor(0), B Case 8 ' 下側

Picture1.Line (0, -10)-(Wid - 10, Hei - 10), QBColor(0), B Picture1.Line (10, -10)-(Wid - 25, Hei - 25), QBColor(0), B End Select

' セルにピクチャーを表示

Set .CellPicture = Picture1.Image End With End Sub MSFlexGrid では個別のセル範囲に罫線を引けない為、Picture に罫線を描いて、其れを指定のセルに貼り付け る事で、セル罫線の表示を実現して居る。此れは、MSFlexGrid でセルの背景色の塗り潰しのパターンの設定を 応用した物で有る。 編集時や選択時に見辛ければ、一旦解除する様にすると良い。削除する場合は、指定のセル位置で、下記の様に 実行する。

Set MSFlexGrid1.CellPicture = LoadPicture()

亦、セル幅(セル高さ)をユーザが変更出来る様に設定して有る場合は、別途変更されたか何うかを監視して(結

参照

関連したドキュメント

In addition, this explanation holds that countries with domestic problems that the government does not want to expose to international criticism tend to be reluctant to promote

構文 :SOURce:VOLTage:RANGe:AUTO 1|0|ON|OFF

A comparison of approximations with simulation estimates for the mean and standard deviation of the maximum jumping window content of two rate- renewal processes with SCV c 2= 15.4

We are also interested in the minimization of the first eigenvalue of the p-Laplacian with Dirichlet boundary conditions among open sets and quasi open sets of given measure..

in [Notes on an Integral Inequality, JIPAM, 7(4) (2006), Art.120] and give some answers which extend the results of Boukerrioua-Guezane-Lakoud [On an open question regarding an

The purpose of this paper is to prove some fundamental properties of maximal open sets and establish a part of the foundation of the theory of maximal open sets in topological

十条冨士塚 附 石造物 有形民俗文化財 ― 平成3年11月11日 浮間村黒田家文書 有形文化財 古 文 書 平成4年3月11日 瀧野川村芦川家文書 有形文化財 古

あれば、その逸脱に対しては N400 が惹起され、 ELAN や P600 は惹起しないと 考えられる。もし、シカの認可処理に統語的処理と意味的処理の両方が関わっ