Public Declare Function SendMessage Lib “user32” Alias “SendMessageA” (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public Const EM_GETSEL = &HB0
Public Const EM_LINEFROMCHAR = &HC9
Public Const EM_LINEINDEX = &HBB
Public Function GetTextBoxRowText(ByVal oTextBox As TextBox, ByVal iLine As Integer) As String ‘获取 TextBox 某行文字
On Error Resume Next
Dim TempArray As Variant
TempArray = Split(oTextBox.Text, vbCrLf, -1, vbTextCompare)
GetTextBoxRowText = TempArray(iLine – 1)
On Error GoTo 0
End Function
Public Function GetTextBoxRowCount(ByVal oTextBox As TextBox) As Integer ‘获取 TextBox 文字行数
On Error Resume Next
GetTextBoxRowCount = 0
Dim TempArray As Variant
TempArray = Split(oTextBox.Text, vbCrLf, -1, vbTextCompare)
GetTextBoxRowCount = UBound(TempArray) – LBound(TempArray) + 1
On Error GoTo 0
End Function
Public Function GetTextBoxColumnCount(ByVal oTextBox As TextBox) As Integer ‘获取 TextBox 文字最大列数
On Error Resume Next
Dim I As Integer, J As Integer
GetTextBoxColumnCount = 0
Dim TempArray As Variant
TempArray = Split(oTextBox.Text, vbCrLf, -1, vbTextCompare)
For I = LBound(TempArray) To UBound(TempArray)
‘Debug.Print Len(TempArray(I)); I
If GetTextBoxColumnCount < Len(TempArray(I)) Then GetTextBoxColumnCount = Len(TempArray(I))
Next I
On Error GoTo 0
End Function
Public Function GetTextBoxColumnCountAtRow(ByVal oTextBox As TextBox, ByVal iRow As Integer) As Integer ‘获取 TextBox 某行文字最大列数
On Error Resume Next
Dim I As Integer, J As Integer
GetTextBoxColumnCountAtRow = 0
Dim TempArray As Variant
TempArray = Split(oTextBox.Text, vbCrLf, -1, vbTextCompare)
Dim iCount As Integer
For I = LBound(TempArray) To UBound(TempArray)
‘Debug.Print Len(TempArray(I)); I
iCount = iCount + 1
If iCount = iRow Then
GetTextBoxColumnCountAtRow = Len(TempArray(I))
Exit For
End If
Next I
On Error GoTo 0
End Function
Public Function GetTextBoxCharCount(ByVal oTextBox As TextBox) As Long’获取 TextBox 文字数
On Error Resume Next
GetTextBoxCharCount = 0
Dim lCount As Long, lRow As Long, lCol As Long
Dim lParam As Long, wParam As Long
‘首先向文本框传递EM_GETSEL消息以获取从起始位置到光标所在位置的字符数
lRet = SendMessage(oTextBox.hwnd, EM_GETSEL, wParam, lParam)
lCount = lRet / 2 ^ 16
‘再向文本框传递EM_LINEFROMCHAR消息根据获得的字符数确定光标以获取所在行数
lRow = SendMessage(oTextBox.hwnd, EM_LINEFROMCHAR, lCount, 0)
lRow = lRow + 1
‘扣除 VbCrlf
GetTextBoxCharCount = lCount – (lRow – 1) * 2
‘向文本框传递EM_LINEINDEX消息以获取所在列数
‘lRet = SendMessage(oTextBox.hWnd, EM_LINEINDEX, -1, 0)
‘lCol = lCount – lRet + 1
On Error GoTo 0
End Function
Public Function GetTextBoxCursorRow(ByVal oTextBox As TextBox) As Long’获取 TextBox 光标所在行
On Error Resume Next
GetTextBoxCursorRow = 0
Dim lCount As Long, lRow As Long, lCol As Long
Dim lParam As Long, wParam As Long
‘首先向文本框传递EM_GETSEL消息以获取从起始位置到光标所在位置的字符数
lRet = SendMessage(oTextBox.hwnd, EM_GETSEL, wParam, lParam)
lCount = lRet / 2 ^ 16
‘再向文本框传递EM_LINEFROMCHAR消息根据获得的字符数确定光标以获取所在行数
lRow = SendMessage(oTextBox.hwnd, EM_LINEFROMCHAR, lCount, 0)
lRow = lRow + 1
GetTextBoxCursorRow = lRow
‘向文本框传递EM_LINEINDEX消息以获取所在列数
‘lRet = SendMessage(oTextBox.hWnd, EM_LINEINDEX, -1, 0)
‘lCol = lCount – lRet + 1
On Error GoTo 0
End Function
Public Function GetTextBoxCursorColumn(ByVal oTextBox As TextBox) As Long’获取 TextBox 光标所在列
On Error Resume Next
GetTextBoxCursorColumn = 0
Dim lCount As Long, lRow As Long, lCol As Long
Dim lParam As Long, wParam As Long
‘首先向文本框传递EM_GETSEL消息以获取从起始位置到光标所在位置的字符数
lRet = SendMessage(oTextBox.hwnd, EM_GETSEL, wParam, lParam)
lCount = lRet / 2 ^ 16
‘再向文本框传递EM_LINEFROMCHAR消息根据获得的字符数确定光标以获取所在行数
lRow = SendMessage(oTextBox.hwnd, EM_LINEFROMCHAR, lCount, 0)
lRow = lRow + 1
‘向文本框传递EM_LINEINDEX消息以获取所在列数
lRet = SendMessage(oTextBox.hwnd, EM_LINEINDEX, -1, 0)
lCol = lCount – lRet + 1
GetTextBoxCursorColumn = lCol
On Error GoTo 0
End Function
Public Sub TurnTextBoxCursor(ByVal oTextBox As TextBox, ByVal iRow As Integer, Optional ByVal iColumn As Integer = 1) ‘把文本文件光标移到某行某列
On Error Resume Next
Dim I As Integer, J As Integer
Dim oShell As Object
Set oShell = CreateObject(“WScript.Shell”)
oTextBox.SetFocus
Dim iCurRow As Integer, iCurColumn As Integer
iCurRow = GetTextBoxCursorRow(oTextBox) ‘当前行
iCurColumn = GetTextBoxCursorColumn(oTextBox) ‘当前列
‘Debug.Print iCurRow; iCurColumn
If iCurRow < iRow Then
For I = iCurRow To iRow – 1
oShell.SendKeys “{DOWN}”
Next I
Else
For I = iRow To iCurRow – 1
oShell.SendKeys “{UP}”
Next I
End If
Wait 50
iCurRow = GetTextBoxCursorRow(oTextBox) ‘当前行
iCurColumn = GetTextBoxCursorColumn(oTextBox) ‘目标行的当前列
‘Debug.Print iCurRow; iCurColumn
If iCurColumn < iColumn Then
For J = iCurColumn To iColumn – 1
oShell.SendKeys “{RIGHT}”
Next J
Else
For J = iColumn To iCurColumn – 1
oShell.SendKeys “{LEFT}”
Next J
End If
Wait 50
iCurRow = GetTextBoxCursorRow(oTextBox) ‘当前行
iCurColumn = GetTextBoxCursorColumn(oTextBox) ‘目标行的当前列
‘Debug.Print iCurRow; iCurColumn
ERR_NORUNNING:
On Error GoTo 0
End Sub