Office中国论坛/Access中国论坛

标题: 批量删除记录 [打印本页]

作者: ycxchen    时间: 2008-12-18 10:19
标题: 批量删除记录
我想通过用手机号码作条件来删除记录,想在窗体的文本框中连续输入一定数量的手机号码,例如5个或10个号码,每个号码用中文的顿号隔开,后单击“删除”按钮,能将输入的手机号码的所有记录删除。请问,要实现此功能如何写VBA代码?[attach]33895[/attach]
作者: Henry D. Sy    时间: 2008-12-18 10:34
Private Sub Command2_Click()
    Dim strWhere As String, strSQL As String
    Dim strArray() As String
    Dim i As Integer
    If IsNull(Me.输入手机号码) Then Exit Sub
    strArray = Split(Me.输入手机号码, "、")
    For i = 0 To UBound(strArray)
        strWhere = strWhere & "'" & strArray(i) & "',"
    Next
    strSQL = "delete from 表1 where 手机 in (" & strWhere & ")"
    CurrentDb.Execute strSQL
End Sub


[ 本帖最后由 Henry D. Sy 于 2008-12-19 19:46 编辑 ]
作者: ycxchen    时间: 2008-12-18 15:04
6D版主太厉害了,不愧是版主,十分感谢您!我想完善两点:1、如果一次输入了数个号码,但其中一个或多个在表中是不存在的,如何用VBA判断?
2、每次限制输入的号码最多不能超过50个,如何写代码?
盼6D高手指教!
作者: Henry D. Sy    时间: 2008-12-18 15:49
问题1,如果这样要求,在最后一个号码输入完毕必须输入中文顿号,否则access不知道你输入结束。
            哪这样的话,上面的删除代码需要修正
            供你参考,自己测试一下

Private Sub 输入手机号码_KeyDown(KeyCode As Integer, Shift As Integer)
    Dim strWhere As String
    Dim strTemp As String
    Dim intCount As Integer
    If KeyCode = 229 Then
        If Len(Me.输入手机号码.Text) >= 11 Then
            strTemp = Mid(Me.输入手机号码.Text, Len(Me.输入手机号码.Text) - 10, 11)
            strWhere = "手机='" & strTemp & "'"
            intCount = DCount("*", "表1", strWhere)
            If intCount = 0 Then
                MsgBox "您刚输入的手机号码不存在"
            End If
        End If
    End If
End Sub

作者: wang1950317    时间: 2008-12-18 16:00
受教![:50] [:50]
作者: Henry D. Sy    时间: 2008-12-18 16:05
问题2

Private Sub 输入手机号码_Change()
    Dim intLength As Integer
    intLength = Len(Me.输入手机号码.Text)
    If intLength > 600 Then
        MsgBox "输入的号码数量已到极限"
    End If
End Sub

作者: Henry D. Sy    时间: 2008-12-18 16:09
判断最后是不是以中文顿号结束输入

Private Sub 输入手机号码_BeforeUpdate(Cancel As Integer)
    If Right(Me.输入手机号码, 1) <> "、" Then
        MsgBox "请输入中文顿号结束输入"
        Cancel = True
    End If
End Sub

作者: ycxchen    时间: 2008-12-18 17:55
万分感谢6D版主,你的水平太高超了!在你面前,对于我的ACCESS水平,我只不过是个小弟弟。好,我先试用。
作者: changweiren    时间: 2008-12-18 19:23
6D,真高,佩服,学习,收藏代码
作者: koutx    时间: 2008-12-18 19:33
收藏              .
作者: ycxchen    时间: 2008-12-18 21:36
6D版主,问题基本解决,感谢您!现还有两个问题不明,再向你请教:
1、你的语句只有当号码位数大于11位才出现提示,而我想当输入的号码小于11位或大于11位时,只要输入顿号就出现提示,于是,我将4楼的代码改成如下:
  Dim strWhere As String
    Dim strTemp As String
    Dim intCount As Integer
    If KeyCode = 229 Then
        If Len(Me.输入手机号码.Text) > 11 Then
            strTemp = Mid(Me.输入手机号码.Text, Len(Me.输入手机号码.Text) - 12, 13)
            strWhere = "手机='" & strTemp & "'"
            intCount = DCount("*", "表1", strWhere)
            If intCount = 0 Then
            MsgBox "您刚输入的手机号码不存在"
            Else
            If Len(Me.输入手机号码.Text) < 11 Then
            strTemp = Mid(Me.输入手机号码.Text, Len(Me.输入手机号码.Text) - 1, 10)
            strWhere = "手机='" & strTemp & "'"
            intCount = DCount("*", "表1", strWhere)
            If intCount = 0 Then
                MsgBox "您刚输入的手机号码不存在"
            End If
        End If
    End If
End If
End If
但不能正确运行,不知是什么原因?还觉得我这样写语句结构太混乱。
2、我看过MID函数帮助,字符位数参数前面是用英文的“,”,但在你的语句中为何用了“-”呢?例如,“- 10”。
作者: Henry D. Sy    时间: 2008-12-18 21:41
问题2先回你,这里是扣掉10.是减号的意思。
作者: Henry D. Sy    时间: 2008-12-18 21:46
Private Sub 输入手机号码_KeyDown(KeyCode As Integer, Shift As Integer)
    Dim strWhere As String
    Dim strTemp As String
    Dim intCount As Integer
    If KeyCode = 229 Then
        If Len(Me.输入手机号码.Text) >= 11 Then
            strTemp = Mid(Me.输入手机号码.Text, Len(Me.输入手机号码.Text) - 10, 11)
            strWhere = "手机='" & strTemp & "'"
            intCount = DCount("*", "表1", strWhere)
            If intCount = 0 Then
                MsgBox "您刚输入的手机号码不存在"
            End If
        Else
            MsgBox "您输入的电话号码位数不够"
        End If
    End If
End Sub

作者: ycxchen    时间: 2008-12-19 10:05
我真糊涂,“Len(Me.输入手机号码.Text) - 10”就个是个参数。衷心感谢6D版主的热心指教!
6D版主真是水平一流,品德一流!
作者: ycxchen    时间: 2008-12-19 11:11
我测试过,按13楼代码运行,只要输入一个数字,电脑都会提示输入的电话号码位数不够,以致不能正常录入号码。于是,我将代码改成如下:

Dim strWhere As String
    Dim strTemp As String
        Dim intCount As Integer
   
    If KeyCode = 229 Then
        If Len(Me.输入手机号码.Text) >= 11 Then
            strTemp = Mid(Me.输入手机号码.Text, Len(Me.输入手机号码.Text) - 10, 11)
            strWhere = "手机='" & strTemp & "'"
            intCount = DCount("*", "表1", strWhere)
            If intCount = 0 Then
                MsgBox "您刚输入的手机号码不存在"
         End If
          Else
            
              If Len(Me.输入手机号码.Text) < 12 And Right(Me.输入手机号码.Text, 1) = "、" Then
            
              MsgBox "您输入的电话号码位数不够"
             End If
        End If
    End If

问题基本解决,但不完善,不能达到输入的号码小于11位时,只要输入顿号就出现提示,而是输入顿号后再输入一数字时才出现提示,如何解决?盼指教。
作者: Henry D. Sy    时间: 2008-12-19 11:25
13楼的代码应该不会出现你说的情况,进行判断的前提是你输入中文顿号。

问题基本解决,但不完善,不能达到输入的号码小于11位时,只要输入顿号就出现提示,而是输入顿号后再输入一数字时才出现提示,如何解决?盼指教。
If Len(Me.输入手机号码.Text) < 12 And Right(Me.输入手机号码.Text, 1) = "、" Then
你的代码我没有测试,但这里至少有个问题,应该<11,而不是12。
作者: ycxchen    时间: 2008-12-19 12:01
谢谢!测试13楼的代码时人是输入中文顿号的,但不能达到目的。我的设想:11位的手机号码加上1个顿号就是12位了。所以,用“If Len(Me.输入手机号码.Text) < 12 And Right(Me.输入手机号码.Text, 1) = "、" Then”来判断,但为何不能达到输入的号码小于11位时,只要输入顿号就出现提示,而是输入顿号后再输入一数字时才出现提示?如何解决?盼指教。
作者: Henry D. Sy    时间: 2008-12-19 12:30
我的设想:11位的手机号码加上1个顿号就是12位了
keydown事件在前,输入在后,所以还是11位

但为何不能达到输入的号码小于11位时,只要输入顿号就出现提示
我测试过是这样的呀。

而是输入顿号后再输入一数字时才出现提示
没发现此问题。
作者: ycxchen    时间: 2008-12-19 12:46
感谢6D的热心教导!但我在我的电脑再次测试13楼的代码时,出现的现象始终是一输入一个数字,电脑就会运行“MsgBox "您输入的电话号码位数不够"”这句,我觉得,这并不是输入不输入顿号的问题,应是小于11位的手机号码时的判断问题了。版主大人你认为呢?
作者: Henry D. Sy    时间: 2008-12-19 13:38
你是不是将
Else
            MsgBox "您输入的电话号码位数不够"
放错位置了。
作者: ycxchen    时间: 2008-12-19 15:37
谢谢了!我没有放错位置,我还是按15楼的办法加一句判断。如果不输入顿号,退出时会出现一错误提示,如下图:
[attach]33934[/attach]
我在更新前事件中加一屏蔽语句: DoCmd.SetWarnings False,
但不起作用。请问,如何才能屏幕上图的提示?
Private Sub 输入手机号码_BeforeUpdate(Cancel As Integer)
If Right(Me.输入手机号码, 1) <> "、" Then
        MsgBox "请输入中文顿号结束输入"
        Cancel = True
       End If
DoCmd.SetWarnings False
End Sub
作者: ycxchen    时间: 2008-12-19 17:42
要屏幕21楼图的提示除了考虑用DoCmd.SetWarnings False语句外,还有其它办法吗?盼大家指教。
作者: Henry D. Sy    时间: 2008-12-19 19:48
原帖由 ycxchen 于 2008-12-19 17:42 发表
要屏幕21楼图的提示除了考虑用DoCmd.SetWarnings False语句外,还有其它办法吗?盼大家指教。

不行,这是错误提示。

怎么到了你哪里出现这么多的错误???
作者: ycxchen    时间: 2008-12-23 10:12
“冬至”回乡下几天了,现才看到帖子,6D真够热心,万分感谢!向您学习。
作者: ycxchen    时间: 2008-12-23 14:58
6D高手,我下载23的例子试用了,但13楼21楼的问题仍会出现,不知何因?
作者: Henry D. Sy    时间: 2008-12-23 16:15
难道是输入法引起的,我的是搜狗拼音
作者: ycxchen    时间: 2008-12-23 17:59
6D高明!我用的是极品五笔输入法。我试过,将输入法转换英方状态,且在代码中将中文的顿号改为“/”,则位数不够等判断语句不起作用了。为方便起见,我想输入手机号码时用输入法为英方状态下的“/”代替中文的顿号,以隔开每个手机号码。请问,如果这样做,要如何改一下代码呢?
作者: Henry D. Sy    时间: 2008-12-23 18:22
Private Sub 输入手机号码_KeyDown(KeyCode As Integer, Shift As Integer)
    Dim strWhere As String
    Dim strTemp As String
    Dim intCount As Integer
    If KeyCode = 191 Then
        If Len(Me.输入手机号码.Text) >= 11 Then
            strTemp = Mid(Me.输入手机号码.Text, Len(Me.输入手机号码.Text) - 10, 11)
            strWhere = "手机='" & strTemp & "'"
            intCount = DCount("*", "表1", strWhere)
            If intCount = 0 Then
                MsgBox "您刚输入的手机号码不存在"
            End If
        Else
            MsgBox "您输入的电话号码位数不够"
            KeyCode = 0
        End If
    End If
End Sub
Private Sub Command2_Click()
    Dim strWhere As String, strSQL As String
    Dim strArray() As String
    Dim i As Integer
    If IsNull(Me.输入手机号码) Then Exit Sub
    strArray = Split(Me.输入手机号码, "/")
    For i = 0 To UBound(strArray)
        strWhere = strWhere & "'" & strArray(i) & "',"
    Next
    strSQL = "delete from 表1 where 手机  (" & strWhere & ")"
    CurrentDb.Execute strSQL
End Sub
Private Sub 输入手机号码_Change()
    Dim intLength As Integer
    intLength = Len(Me.输入手机号码.Text)
    If intLength > 600 Then
        MsgBox "输入的号码数量已到极限"
    End If
End Sub
Private Sub 输入手机号码_BeforeUpdate(Cancel As Integer)
    If Right(Me.输入手机号码, 1) <> "/" Then
        MsgBox "请输入“ / ”号结束输入"
        Cancel = True
    End If
End Sub

作者: ycxchen    时间: 2008-12-24 10:19
万分感谢6D版主!你真是位高手中的高手。我现请教:“ If KeyCode = 191 Then”中的“KeyCode”在F1中帮助中看不到相关的解释,但为何在VBA中可应用的?
作者: Henry D. Sy    时间: 2008-12-24 10:32
有呀,怎么会没有?
在帮助中输入keycode回车看看。
作者: ycxchen    时间: 2008-12-24 12:15
万分感谢6D版主,教导我学会不少VBA!!直接按F1不能查到,但通过搜索可以查到。看过帮助,但对KeyCode = 191 为什么代表英文输入法不明白,请指教!
作者: Henry D. Sy    时间: 2008-12-24 14:43
但对KeyCode = 191 为什么代表英文输入法不明白
不是代表英文输入法,而是英文斜杆的keycode=191

[ 本帖最后由 Henry D. Sy 于 2008-12-24 14:58 编辑 ]
作者: ycxchen    时间: 2008-12-24 16:15
明白,谢谢!




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3