U need a control MSFlexGrid1 and a textbox with name txtGrid
Private m_lCurrentRow As Long
Private m_lCurrentCol As Long
Private m_lEditedRow As Long
Private m_lEditedCol As Long
Private m_bCancel As Boolean
Private Function IsUnWantedKeyCode(KeyCode As Integer, Shift As Integer)
As Boolean
Select Case KeyCode
Case vbKeyUp, vbKeyDown, vbKeyRight, vbKeyLeft, vbKeyEscape, 16, vbKeyReturn, vbKeyPageUp,
vbKeyPageDown, vbKeyHome, vbKeyEnd,
vbKeyEscape, vbKeyControl, vbKeyInsert,
vbKeyF1, vbKeyF2, vbKeyF3, vbKeyF4, vbKeyF5, vbKeyF6, vbKeyF7, vbKeyF8, vbKeyF9, vbKeyF10,
vbKeyF11, vbKeyF12
IsUnWantedKeyCode = True
Case Else
IsUnWantedKeyCode = False
End Select
End Function
Private Function IsCellLocked(lRow As Long, lCol As Long) As Boolean
IsCellLocked = False
' Logic for Cell Locking to be placed here
' Example - To Lock Cell 1,2
' If lRow = 1 And lCol = 2 Then
' IsCellLocked = True
' End If
End Function
Private Sub MSFlexGrid1_KeyDown(KeyCode As Integer, Shift As Integer)
If IsCellLocked(MSFlexGrid1.Row, MSFlexGrid1.Col) Then
Exit Sub
End If
If KeyCode = vbKeyDelete Then
MSFlexGrid1.Text = ""
Exit Sub
End If
If Not IsUnWantedKeyCode(KeyCode, Shift) Then
m_bCancel = False
m_lCurrentRow = MSFlexGrid1.Row
m_lCurrentCol = MSFlexGrid1.Col
m_lEditedRow = MSFlexGrid1.Row
m_lEditedCol = MSFlexGrid1.Col
txtGrid.Top = MSFlexGrid1.CellTop + MSFlexGrid1.Top
txtGrid.Height = MSFlexGrid1.CellHeight
txtGrid.Left = MSFlexGrid1.CellLeft + MSFlexGrid1.Left
txtGrid.Width = MSFlexGrid1.CellWidth
txtGrid.Text = ""
txtGrid.Visible = True
txtGrid.SetFocus
If KeyCode >= 65 And KeyCode <= 90 Then
If Shift = 0 Then
KeyCode = KeyCode + 32
End If
End If
SendKeys Chr(KeyCode)
txtGrid.Visible = True
End If
End Sub
Private Sub txtGrid_KeyDown(KeyCode As Integer, Shift As Integer)
Select Case KeyCode
Case vbKeyUp
If m_lCurrentRow > MSFlexGrid1.FixedRows Then
m_lCurrentRow = m_lCurrentRow - 1
MSFlexGrid1.Row = m_lCurrentRow
MSFlexGrid1.Col = m_lCurrentCol
MSFlexGrid1.SetFocus
End If
Case vbKeyDown
If m_lCurrentRow < MSFlexGrid1.Rows - 1 Then
m_lCurrentRow = m_lCurrentRow + 1
MSFlexGrid1.Row = m_lCurrentRow
MSFlexGrid1.Col = m_lCurrentCol
MSFlexGrid1.SetFocus
End If
Case vbKeyReturn
If m_lCurrentRow < MSFlexGrid1.Rows - 1 Then
m_lCurrentRow = m_lCurrentRow + 1
MSFlexGrid1.Row = m_lCurrentRow
MSFlexGrid1.Col = m_lCurrentCol
MSFlexGrid1.SetFocus
End If
Case vbKeyLeft
If m_lCurrentCol > MSFlexGrid1.FixedCols Then
m_lCurrentCol = m_lCurrentCol - 1
MSFlexGrid1.Row = m_lCurrentRow
MSFlexGrid1.Col = m_lCurrentCol
MSFlexGrid1.SetFocus
End If
Case vbKeyRight
If m_lCurrentCol < MSFlexGrid1.Cols - 1 Then
m_lCurrentCol = m_lCurrentCol + 1
MSFlexGrid1.Row = m_lCurrentRow
MSFlexGrid1.Col = m_lCurrentCol
MSFlexGrid1.SetFocus
End If
Case vbKeyEscape
m_bCancel = True
MSFlexGrid1.Row = m_lCurrentRow
MSFlexGrid1.Col = m_lCurrentCol
MSFlexGrid1.SetFocus
End Select
End Sub
Private Sub MSFlexGrid1_Click()
MSFlexGrid1.SetFocus
End Sub
Private Function SetCellText()
Dim lTmpRow As Long
Dim lTmpCol As Long
lTmpRow = MSFlexGrid1.Row
lTmpCol = MSFlexGrid1.Col
If Not m_bCancel Then
MSFlexGrid1.Row = m_lEditedRow
MSFlexGrid1.Col = m_lEditedCol
MSFlexGrid1.Text = txtGrid.Text
End If
m_bCancel = False
MSFlexGrid1.Row = lTmpRow
MSFlexGrid1.Col = lTmpCol
End Function
Private Sub txtGrid_LostFocus()
SetCellText
txtGrid.Visible = False
End Sub