'フォームに、MSFlexGrid1、テキストボックスText_Editを配置する
            
'メニューエディタで
'キャプション:編集、名前:Edit
'(その下に)  キャプション:切り取り、名前:Edit_Cut
'         キャプション:コピー、名前:Edit_Copy
'         キャプション:全て選択、名前:Edit_Select_All
'         キャプション:貼り付け、名前:Edit_Paste
  
'テキストボックスのポップアップメニュー表示のためのAPI
Private Declare Function LockWindowUpdate Lib "user32" _
     (ByVal hwndLock As Long) As Long
  
Dim Nyuuryoku As Boolean
Dim GridTemp As String
  
Private Sub Form_Load()
  Dim i As Integer
  Dim j As Integer
  
  Me.Show
  
  With MSFlexGrid1
    .Rows = 11   '行数(固定行を含む)
    .Cols = 11     '列数(固定列を含む)
    .Row = 1    '最初のセルの行番号
    .Col = 1    '最初のセルの列番号
    .RowSel = 1   '最後のセルの行番号
    .ColSel = 1   '最後のセルの列番号
    .FixedCols = 1  '固定列の数
    .FixedRows = 1  '固定行の数
    .AllowUserResizing = 3  '行列幅を自由に変更できる
    .ColWidth(0) = (Int(Log(.Rows) / Log(10)) + 1) * 120 + 80 '列幅指定 (固定列)
    .RowHeight(-1) = 300  '行幅指定(-1で全部を変更)
    
  End With
  
  '固定行にナンバーをふる
  With MSFlexGrid1
    For i = 1 To .Rows - 1
      .TextMatrix(i, 0) = i
    Next i
    For i = 1 To .Cols - 1
      .TextMatrix(0, i) = i
    Next i
  End With
  
  MSFlexGrid1_EnterCell
  
End Sub
  
Private Sub MSFlexGrid1_EnterCell()
'セルがアクティブになったときの処理
'テキストボックスの位置とサイズを合わせ、セルの文字をテキストボックスに記入する
  
  With Text_Edit
    .Text = ""
    
    'テキストボックスの位置とサイズを合わせる
    .Top = MSFlexGrid1.Top + MSFlexGrid1.CellTop
    .Left = MSFlexGrid1.Left + MSFlexGrid1.CellLeft
    .Height = MSFlexGrid1.CellHeight
    .Width = MSFlexGrid1.CellWidth
    
    .Text = MSFlexGrid1.Text
    .Visible = True
    .Enabled = True
    .SetFocus
    
    If .Text <> "" Then
      Nyuuryoku = True
    End If
    
  End With
  
End Sub
  
Private Sub MSFlexGrid1_LeaveCell()
'カレントセルが移動したとき
  
  MSFlexGrid1.Text = ""
  MSFlexGrid1.Text = Text_Edit.Text
  
End Sub
  
Private Sub MSFlexGrid1_KeyDown(KeyCode As Integer, Shift As Integer)
  
  'Deleteキーが押された場合
  If KeyCode = vbKeyDelete Then
    MSFlexGrid1.FillStyle = flexFillRepeat
    MSFlexGrid1.Text = ""
    Text_Edit.Text = ""
    MSFlexGrid1.FillStyle = flexFillSingle
  End If
  
End Sub
  
Private Sub MSFlexGrid1_Scroll()
  
  Text_Edit.Visible = False
  
End Sub
  
Private Sub Text_Edit_KeyDown(KeyCode As Integer, Shift As Integer)
  
  Dim dRow As Long
  Dim dCol As Long
  Dim Houkou As Integer
  Dim MyLast As Long
  
  If Shift = 3 Then   'Shift + Ctrl
      If KeyCode = vbKeyDown Or KeyCode = vbKeyUp Or KeyCode = vbKeyRight _
        Or KeyCode = vbKeyLeft Then
        
        If KeyCode = vbKeyDown Then
          Houkou = 1
          MyLast = MSFlexGrid1.ColSel
        ElseIf KeyCode = vbKeyUp Then
          Houkou = 2
          MyLast = MSFlexGrid1.ColSel
        ElseIf KeyCode = vbKeyRight Then
          Houkou = 3
          MyLast = MSFlexGrid1.RowSel
        ElseIf KeyCode = vbKeyLeft Then
          Houkou = 4
          MyLast = MSFlexGrid1.RowSel
        End If
        
        ShiftCtrlHoukou Houkou, MyLast
        
      End If
  ElseIf Shift = 1 Then 'Shift
    If KeyCode = vbKeyDown Or KeyCode = vbKeyUp Or KeyCode = vbKeyRight _
      Or KeyCode = vbKeyLeft Then
  
      Text_Edit.Visible = False
    End If
  ElseIf Shift = 2 Then   'Ctrl
    If KeyCode = vbKeyDown Or KeyCode = vbKeyUp Or KeyCode = vbKeyRight _
      Or KeyCode = vbKeyLeft Then
      
      If KeyCode = vbKeyDown Then
        Houkou = 1
      ElseIf KeyCode = vbKeyUp Then
        Houkou = 2
      ElseIf KeyCode = vbKeyRight Then
        Houkou = 3
      ElseIf KeyCode = vbKeyLeft Then
        Houkou = 4
      End If
      
      ControlHoukou Houkou
      
    End If
  
  ElseIf KeyCode = vbKeyReturn Or KeyCode = vbKeyDown Then
    dRow = MSFlexGrid1.Row + 1
    If dRow < MSFlexGrid1.Rows Then
      MSFlexGrid1.Row = dRow
    End If
  ElseIf KeyCode = vbKeyUp Then
    dRow = MSFlexGrid1.Row - 1
    If dRow > 0 Then
      MSFlexGrid1.Row = dRow
    End If
  ElseIf KeyCode = vbKeyRight Then
    dCol = MSFlexGrid1.Col + 1
    If dCol < MSFlexGrid1.Cols Then
      MSFlexGrid1.Col = dCol
    End If
  ElseIf KeyCode = vbKeyLeft Then
    dCol = MSFlexGrid1.Col - 1
    If dCol > 0 Then
      MSFlexGrid1.Col = dCol
    End If
  ElseIf KeyCode = vbKeyDelete Then
    Text_Edit.Visible = False
    MSFlexGrid1.FillStyle = flexFillRepeat
    MSFlexGrid1.Text = ""
    Text_Edit.Text = ""
    MSFlexGrid1.FillStyle = flexFillSingle
  ElseIf Nyuuryoku = True Then
    Text_Edit.Text = ""
    Nyuuryoku = False
    
  End If
    
End Sub
  
Sub ControlHoukou(Houkou As Integer)
  
  Dim i As Long
  
  MSFlexGrid1.Text = ""
  MSFlexGrid1.Text = Text_Edit.Text
  
  With MSFlexGrid1
  
    Select Case Houkou
      Case 1  'Ctrl + ↓
        If .Row = .Rows - 1 Then
          Exit Sub
        ElseIf .Text <> "" Then
          If .TextMatrix(.Row + 1, .Col) = "" Then
            For i = .Row + 1 To .Rows - 1
              If .TextMatrix(i, .Col) <> "" Then
                .Row = i
                Exit Sub
              ElseIf i = .Rows - 1 Then
                .Row = i
              End If
            Next i
          
          Else
            For i = .Row + 1 To .Rows - 1
              If .TextMatrix(i, .Col) = "" Then
                .Row = i - 1
                Exit Sub
              ElseIf i = .Rows - 1 Then
                .Row = i
              End If
            Next i
          End If
        ElseIf .Text = "" Then
          For i = .Row + 1 To .Rows - 1
            If .TextMatrix(i, .Col) <> "" Then
              .Row = i
              Exit Sub
            ElseIf i = .Rows - 1 Then
              .Row = i
            End If
          Next i
        End If
      Case 2  'Ctrl + ↑
        If .Row = .FixedRows Then
          Exit Sub
        ElseIf .Text <> "" Then
          If .TextMatrix(.Row - 1, .Col) = "" Then
             For i = .Row - 1 To .FixedRows Step -1
              If .TextMatrix(i, .Col) <> "" Then
                .Row = i
                Exit Sub
              ElseIf i = .FixedRows Then
                .Row = i
              End If
            Next i
          Else
            For i = .Row - 1 To .FixedRows Step -1
              If .TextMatrix(i, .Col) = "" Then
                .Row = i + 1
                Exit Sub
              ElseIf i = .FixedRows Then
                .Row = i
              End If
            Next i
          End If
          
        ElseIf .Text = "" Then
          For i = .Row - 1 To .FixedRows Step -1
            If .TextMatrix(i, .Col) <> "" Then
              .Row = i
              Exit Sub
            ElseIf i = .FixedRows Then
              .Row = i
            End If
          Next i
        End If
      Case 3  'Ctrl + →
        If .Col = .Cols - 1 Then
          Exit Sub
        ElseIf .Text <> "" Then
          If .TextMatrix(.Row, .Col + 1) = "" Then
            For i = .Col + 1 To .Cols - 1
              If .TextMatrix(.Row, i) <> "" Then
                .Col = i
                Exit Sub
              ElseIf i = .Cols - 1 Then
                .Col = i
              End If
            Next i
          Else
            For i = .Col + 1 To .Cols - 1
              If .TextMatrix(.Row, i) = "" Then
                .Col = i - 1
                Exit Sub
              ElseIf i = .Cols - 1 Then
                .Col = i
              End If
            Next i
          
          End If
          
        ElseIf .Text = "" Then
          For i = .Col + 1 To .Cols - 1
            If .TextMatrix(.Row, i) <> "" Then
              .Col = i
              Exit Sub
            ElseIf i = .Cols - 1 Then
              .Col = i
            End If
          Next i
        End If
      Case 4  'Ctrl + ←
        If .Col = .FixedCols Then
          Exit Sub
        ElseIf .Text <> "" Then
          If .TextMatrix(.Row, .Col - 1) <> "" Then
            For i = .Col - 1 To .FixedCols Step -1
              If .TextMatrix(.Row, i) = "" Then
                .Col = i + 1
                Exit Sub
              ElseIf i = .FixedCols Then
                .Col = i
              End If
            Next i
          Else
            For i = .Col - 1 To .FixedCols Step -1
              If .TextMatrix(.Row, i) <> "" Then
                .Col = i
                Exit Sub
              ElseIf i = .FixedCols Then
                .Col = i
              End If
            Next i
          End If
        ElseIf .Text = "" Then
          For i = .Col - 1 To .FixedCols Step -1
            If .TextMatrix(.Row, i) <> "" Then
              .Col = i
              Exit Sub
            ElseIf i = .FixedCols Then
              .Col = i
            End If
          Next i
        End If
    End Select
    
  End With
          
            
End Sub
  
Sub ShiftCtrlHoukou(Houkou As Integer, MyLast As Long)
   
  Dim i As Long
  Dim FirstRow As Long
  Dim FirstCol As Long
  Dim LastRow As Long
  Dim LastCol As Long
  
  MSFlexGrid1.Text = ""
  MSFlexGrid1.Text = Text_Edit.Text
  
  With MSFlexGrid1
  
    Select Case Houkou
      Case 1  'Ctrl + ↓
        FirstRow = .Row
        .Row = .RowSel
        LastCol = MyLast
        If .Row = .Rows - 1 Then
          Exit Sub
        ElseIf .Text <> "" Then
          If .TextMatrix(.Row + 1, .Col) = "" Then
            For i = .Row + 1 To .Rows - 1
              If .TextMatrix(i, .Col) <> "" Then
                .Row = FirstRow
                .RowSel = i
                .ColSel = LastCol
                Exit Sub
              ElseIf i = .Rows - 1 Then
                .Row = FirstRow
                .RowSel = i
                .ColSel = LastCol
              End If
            Next i
          
          Else
            For i = .Row + 1 To .Rows - 1
              If .TextMatrix(i, .Col) = "" Then
                .Row = FirstRow
                .RowSel = i - 1
                .ColSel = LastCol
                Exit Sub
              ElseIf i = .Rows - 1 Then
                .Row = FirstRow
                .RowSel = i
                .ColSel = LastCol
              End If
            Next i
          End If
        ElseIf .Text = "" Then
          For i = .Row + 1 To .Rows - 1
            If .TextMatrix(i, .Col) <> "" Then
              .Row = FirstRow
              .RowSel = i
              .ColSel = LastCol
              Exit Sub
            ElseIf i = .Rows - 1 Then
              .Row = FirstRow
              .RowSel = i
              .ColSel = LastCol
            End If
          Next i
        End If
      Case 2  'Ctrl + ↑
        FirstRow = .Row
        .Row = .RowSel
        LastCol = MyLast
        If .Row = .FixedRows Then
          Exit Sub
        ElseIf .Text <> "" Then
          If .TextMatrix(.Row - 1, .Col) = "" Then
             For i = .Row - 1 To .FixedRows Step -1
              If .TextMatrix(i, .Col) <> "" Then
                .Row = FirstRow
                .RowSel = i
                .ColSel = LastCol
                Exit Sub
              ElseIf i = .FixedRows Then
                .Row = FirstRow
                .RowSel = i
                .ColSel = LastCol
              End If
            Next i
          Else
            For i = .Row - 1 To .FixedRows Step -1
              If .TextMatrix(i, .Col) = "" Then
                .Row = FirstRow
                .RowSel = i + 1
                .ColSel = LastCol
                Exit Sub
              ElseIf i = .FixedRows Then
                .Row = FirstRow
                .RowSel = i
                .ColSel = LastCol
              End If
            Next i
          End If
          
        ElseIf .Text = "" Then
          For i = .Row - 1 To .FixedRows Step -1
            If .TextMatrix(i, .Col) <> "" Then
              .Row = FirstRow
              .RowSel = i
              .ColSel = LastCol
              Exit Sub
            ElseIf i = .FixedRows Then
              .Row = FirstRow
              .RowSel = i
              .ColSel = LastCol
             End If
          Next i
        End If
      Case 3  'Ctrl + →
        FirstCol = .Col
        .Col = .ColSel
        LastRow = MyLast
        If .Col = .Cols - 1 Then
          Exit Sub
        ElseIf .Text <> "" Then
          If .TextMatrix(.Row, .Col + 1) = "" Then
            For i = .Col + 1 To .Cols - 1
              If .TextMatrix(.Row, i) <> "" Then
                .Col = FirstCol
                .ColSel = i
                .RowSel = LastRow
                Exit Sub
              ElseIf i = .Cols - 1 Then
                .Col = FirstCol
                .ColSel = i
                .RowSel = LastRow
              End If
            Next i
          Else
            For i = .Col + 1 To .Cols - 1
              If .TextMatrix(.Row, i) = "" Then
                .Col = FirstCol
                .ColSel = i - 1
                .RowSel = LastRow
                Exit Sub
              ElseIf i = .Cols - 1 Then
                .Col = FirstCol
                .ColSel = i
                .RowSel = LastRow
              End If
            Next i
          
          End If
          
        ElseIf .Text = "" Then
          For i = .Col + 1 To .Cols - 1
            If .TextMatrix(.Row, i) <> "" Then
              .Col = FirstCol
              .ColSel = i
              .RowSel = LastRow
              Exit Sub
            ElseIf i = .Cols - 1 Then
              .Col = FirstCol
              .ColSel = i
              .RowSel = LastRow
            End If
          Next i
        End If
      Case 4  'Ctrl + ←
        FirstCol = .Col
        .Col = .ColSel
        LastRow = MyLast
        If .Col = .FixedCols Then
          Exit Sub
        ElseIf .Text <> "" Then
          If .TextMatrix(.Row, .Col - 1) <> "" Then
            For i = .Col - 1 To .FixedCols Step -1
              If .TextMatrix(.Row, i) = "" Then
                .Col = FirstCol
                .ColSel = i + 1
                .RowSel = LastRow
                Exit Sub
              ElseIf i = .FixedCols Then
                .Col = FirstCol
                .ColSel = i
                .RowSel = LastRow
              End If
            Next i
          Else
            For i = .Col - 1 To .FixedCols Step -1
              If .TextMatrix(.Row, i) <> "" Then
                .Col = FirstCol
                .ColSel = i
                .RowSel = LastRow
                Exit Sub
              ElseIf i = .FixedCols Then
                .Col = FirstCol
                .ColSel = i
                .RowSel = LastRow
              End If
            Next i
          End If
        ElseIf .Text = "" Then
          For i = .Col - 1 To .FixedCols Step -1
            If .TextMatrix(.Row, i) <> "" Then
              .Col = FirstCol
              .ColSel = i
              .RowSel = LastRow
              Exit Sub
            ElseIf i = .FixedCols Then
              .Col = FirstCol
              .ColSel = i
              .RowSel = LastRow
            End If
          Next i
        End If
    End Select
    
  End With
            
End Sub
  
Private Sub Text_Edit_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
'ビット 0 がマウスの左ボタン、ビット 1 が右ボタン、ビット 2 が中央ボタンに対応
  
  Text_Edit.Visible = False
    
  'マウスの右クリックで、ポップアップメニュー表示
  If Button = vbRightButton Then
    LockWindowUpdate Text_Edit.hWnd
    Text_Edit.Enabled = False
    DoEvents
    PopupMenu Edit
    Text_Edit.Enabled = True
    LockWindowUpdate 0&
   End If
    
End Sub
  
Private Sub MSFlexGrid1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
  If Text_Edit.Visible = False Then
    Text_Edit.Visible = True
    Text_Edit.SetFocus
  End If
  
  If Button = vbRightButton Then
    With MSFlexGrid1
      If .Row = .RowSel And .Col = .ColSel Then
      'セルが複数選択してない場合
        If .MouseRow > .FixedRows - 1 And .MouseCol > .FixedCols - 1 Then
          .Row = .MouseRow
          .Col = .MouseCol
        Else  '固定行の場合
          Exit Sub
        End If
        
        PopupMenu Edit
      Else
      'セルが複数選択してある場合
        If .Row <= .MouseRow And .MouseRow <= .RowSel _
          And .Col <= .MouseCol And .MouseCol <= .ColSel Then
        'マウスが範囲内にある場合
        
          PopupMenu Edit
          
        Else
        'マウスが範囲外にある場合
          If .MouseRow > .FixedRows - 1 And .MouseCol > .FixedCols - 1 Then
            .Row = .MouseRow
            .Col = .MouseCol
          Else
            Exit Sub
          End If
          
          PopupMenu Edit
        End If
        
      End If
    End With
End If
  
End Sub
  
Private Sub Edit_Cut_Click()
  Dim TempText As String
  
  TempText = MSFlexGrid1.Clip
  Clipboard.Clear
  Clipboard.SetText TempText
  MSFlexGrid1.FillStyle = flexFillRepeat
  MSFlexGrid1.Text = ""
  Text_Edit.Text = ""
  MSFlexGrid1.FillStyle = flexFillSingle
  'MSFlexGridからコピーの場合、一時保存
  GridTemp = TempText
  
End Sub
  
Private Sub Edit_Copy_Click()
'コピー
  
  Dim TempText As String
  
  TempText = MSFlexGrid1.Clip
  Clipboard.Clear
  Clipboard.SetText TempText
  
  'MSFlexGridからコピーの場合、一時保存
  GridTemp = TempText
  
End Sub
  
Private Sub Edit_Select_All_Click()
  '全セルを選択
  With MSFlexGrid1
    .Row = .FixedRows
    .Col = .FixedCols
    .RowSel = .Rows - 1
    .ColSel = .Cols - 1
  End With
  
End Sub
  
Private Sub Edit_Paste_Click()
'貼り付け
  
  Dim TempText As String
  Dim IRow As Integer
  Dim ICol As Integer
  
  IRow = 1
  ICol = 1
  
  TempText = Clipboard.GetText
  
  'データの行数、列数を得る
  Search TempText, IRow, ICol
  
  '範囲を指定し、貼り付け
  With MSFlexGrid1
    If .Row + IRow <= .Rows And .Col + ICol <= .Cols Then
      .RowSel = .Row + IRow - 1
      .ColSel = .Col + ICol - 1
      .Clip = TempText
      Text_Edit.Text = .TextMatrix(.Row, .Col)
    Else
      MsgBox "貼り付け先が範囲外です", vbOKOnly, "警告"
    End If
  End With
  
End Sub
Private Sub Search(ByVal Temp As String, r As Integer, C As Integer)
'データの行数、列数を得る
  
  Dim TmpString As String
  Dim MyTemp As String
   
  '貼り付けデータの一時保存
  MyTemp = Temp
   
  '1行分の文字列を得る Chr(13)=リターン
  TmpString = Left(Temp, InStr(Temp, Chr(13)))
   
  '列数を得る  Chr(9)=タブ
  Do Until InStr(TmpString, Chr(9)) = 0
    TmpString = Mid(TmpString, InStr(TmpString, Chr(9)) + 1)
    C = C + 1
  Loop
   
  '行数を得る
  Do Until InStr(Temp, Chr(13)) = 0
    Temp = Mid(Temp, InStr(Temp, Chr(13)) + 1)
    r = r + 1
  Loop
   
  r = r - 1
   
  'MSFlexGridからのコピーの場合
  If MyTemp = GridTemp Then
    r = r + 1
    If r = 1 Then
      '列数を得る
      Do Until InStr(MyTemp, Chr(9)) = 0
        MyTemp = Mid(MyTemp, InStr(MyTemp, Chr(9)) + 1)
        C = C + 1
      Loop
    End If
  
  End If
   
End Sub
      
 
    

