请问:如何用VB删除文本框前n行
vb吧
全部回复
仅看楼主
level 7
peeppp 楼主
一个多行文本框,
里面有N行内容,
请问
如何每点一次按钮,
就自动删除前3行内容,直到文本内容全部清空为止
谢谢
2021年12月16日 08点12分 1
level 6
确实没这么玩过,但摸索了一下,发现多行之间实际是有“回车”和“换行”符的,借助这个可以实现你的要求,这个可以点击一下删除一行,你再改改吧
2021年12月16日 10点12分 2
用Mid函数去掉字符串的前半部分时,第三个参数可以不用写,并且InStr的第一个参数为1时,也可以省略(少见的可以省略前面参数的函数):Mid(Text1.Text, InStr(Text1.Text, vbCrLf) + 2)
2021年12月16日 12点12分
@初音✨七奈 这个只能删一行,删一行的代码我有
2021年12月16日 23点12分
这个只能删一行,删一行的代码我有
2021年12月16日 23点12分
@peeppp 自己有点思考能力行不?删3行不就是3次删一行?这句代码写三遍就行了
2021年12月17日 00点12分
level 1
Dim Arr() As String
Dim Temp As String
If Text1.Text <> "" Then
If InStr(Text1.Text, vbCrLf) > 0 Then
Temp = ""
Arr = Split(Text1.Text, vbCrLf)
If UBound(Arr) > 1 Then
For i = 3 To UBound(Arr)
If Temp = "" Then
Temp = Arr(i)
Else
Temp = Temp & vbCrLf & Arr(i)
End If
Next
Text1.Text = Temp
End If
End If
End If
2021年12月17日 00点12分 3
多谢,多谢,可用
2021年12月17日 01点12分
这个思路可行,不过代码还可以优化,比如一开始没必要判定文本框是否为空,然后也没必要判断UBound(Arr)的值(For语句自己就判断了)
2021年12月17日 01点12分
@初音✨七奈 你自己复制代码把那些你认为需要去掉的去掉测试试下
2021年12月17日 01点12分
@贴吧用户_Qyb84K3 试过了,没有问题,删掉的是If Text1.Text <> "" Then和If UBound(Arr) > 1 Then这两句以及与它们搭配的End If,另外还把Temp = ""这句也删掉了
2021年12月17日 02点12分
level 1
Dim Temp As String
Dim i As Long
Dim NumberRows As Long
NumberRows = 3 '修改3为要删除的行数
i = 0
Temp = Text1.Text
If Temp <> "" Then
Do While InStr(Temp, vbCrLf) > 0
i = i + 1
Temp = Mid(Temp, InStr(Temp, vbCrLf) + 1, Len(Temp) - InStr(Temp, vbCrLf) )
If i = NumberRows Then
Exit Do
End If
Loop
Text1.Text = Temp
End If
2021年12月17日 02点12分 5
厉害了,这下方便了,谢谢大侠~~~~~~~~~~~~~
2021年12月17日 05点12分
level 11
上面这些办法用于有回车的内容,而如果是连续长内容就会不一样很麻烦,
我发现一个Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpString As String) As Long可以返回中英混合文本所占长度,考虑用循环找出每行第几个字符是行尾,然后就可删掉前面
2021年12月17日 04点12分 6
level 11
参考图片
2021年12月17日 04点12分 7
level 11
Option Explicit
Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpString As String) As Long
Private Sub Command1_Click()
Text1.Text = DeleteLine(Text1.Text, 41, 3) '这里假设文本框一行41个半角字符
End Sub
Private Sub Form_Load()
Dim ILoad As Integer
Dim SLoad As String
SLoad = ""
For ILoad = 1 To 30
SLoad = SLoad & "1234567890"
Next ILoad
Text1.Text = SLoad
End Sub
Function DeleteLine(ByVal DeleteText As String, ByVal LineLength As Integer, ByVal DeleteRow As Integer) As String
Dim s As String
Dim n As Integer
Dim i As Integer
Dim j As Integer
DeleteLine = DeleteText
s = DeleteText
For j = 1 To DeleteRow
n = 0
For i = 1 To LineLength + 10
If lstrlen(Left(s, i)) = LineLength - 1 And lstrlen(Left(s, i + 1)) = LineLength + 1 Then
n = i
ElseIf lstrlen(Left(s, i)) = LineLength Then
n = i
End If
Next i
If n > 0 Then
s = Mid(s, n + 1)
Else
s = ""
End If
Next j
DeleteLine = s
End Function
2021年12月17日 04点12分 8
[大拇指]
2021年12月17日 05点12分
你这个实现的是什么功能, 我看不懂唉,把代码放进VB中测试,也没理解作用,是在一个长段落中截取特定数量字符吗?跟我的需求不太符合,我的每行内容不多
2021年12月17日 05点12分
level 11
我刚刚发现,文本框中用鼠标点击行尾然后加回车,可能会比仅用键盘加回车,看起来要少一空行,可是两者的实际内容却是完全一样的,这样我并不确定楼主需求是删除几行,所以我这个还是算失败的不能用[狂汗]
2021年12月17日 07点12分 9
level 1
Dim Temp As String
Dim Arr() As String
Dim NumberRows As Long
NumberRows = 3 '修改3为要删除的行数
If Text1.Text <> "" Then
Arr = Split(Text1.Text, vbCrLf)
If UBound(Arr) > 2 Then
For i = 0 To NumberRows - 1
If Temp = "" Then
Temp = Arr(i)
Else
Temp = Temp & vbCrLf & Arr(i)
End If
Next
Temp = Temp & vbCrLf
Text1.Text = Mid(Text1.Text, Len(Temp), Len(Text1.Text) - Len(Temp) + 1)
End If
End If
2021年12月17日 10点12分 10
多谢~~~~~~~~~~
2021年12月19日 23点12分
level 11
'再提供一个能处理回车的整合版
'在窗体上放置一个文本框Text1,并将其MultiLine属性设为True
'在窗体上放置一个按钮Command1
'运行程序,记住Text1每行最大多少个数字,替换41
Option Explicit
Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpString As String) As Long
Private Sub Command1_Click()
Text1.Text = DeleteLine(Text1.Text, 41, 3) '这里假设文本框一行41个半角字符
End Sub
Private Sub Form_Load()
Dim ILoad As Integer
Dim SLoad As String
SLoad = ""
For ILoad = 1 To 30
SLoad = SLoad & "1234567890"
Next ILoad
Text1.Text = SLoad
End Sub
Function DeleteLine(ByVal DeleteText As String, ByVal LineLength As Integer, ByVal DeleteRow As Integer) As String
Dim DeleteLineS As String
Dim DeleteLineN As Integer
Dim DeleteLineI As Integer
Dim DeleteLineJ As Integer
Dim DeleteLineB As Boolean
DeleteLine = DeleteText
DeleteLineS = DeleteText
For DeleteLineJ = 1 To DeleteRow
DeleteLineN = 0
DeleteLineB = True
For DeleteLineI = 1 To LineLength + 1
If lstrlen(Left(DeleteLineS, DeleteLineI)) <= LineLength + 1 Then
If Mid(DeleteLineS, DeleteLineI, 2) = vbCrLf Then
DeleteLineS = Mid(DeleteLineS, DeleteLineI + 2)
DeleteLineB = False
Exit For
Else
If lstrlen(Left(DeleteLineS, DeleteLineI)) = LineLength - 1 And lstrlen(Left(DeleteLineS, DeleteLineI + 1)) = LineLength + 1 Then
DeleteLineN = DeleteLineI
ElseIf lstrlen(Left(DeleteLineS, DeleteLineI)) = LineLength Then
DeleteLineN = DeleteLineI
End If
End If
End If
Next DeleteLineI
If DeleteLineB Then
If DeleteLineN > 0 Then
DeleteLineS = Mid(DeleteLineS, DeleteLineN + 1)
Else
DeleteLineS = ""
End If
End If
Next DeleteLineJ
DeleteLine = DeleteLineS
End Function
2021年12月17日 11点12分 11
谢谢!!!!!
2021年12月19日 23点12分
1