jieay 2022-05-22 19:06 采纳率: 100%
浏览 244
已结题

关于VBA,”删除选中单列不含指定字符的行“ 问题请教!

问题1:我改了代码之后,添加了很多要删除的字符串数组,会提示 “运行错误'91':对象变量或With块变量未设置,(添加部分不会提示)。”
是添加的符串超出了最大限制吗?
问题2:我自己加了删除多余列和排序后,就不执行前边的字符串数据筛选删除了?
请大家帮解答下,非常感谢!
问题3:有其它更简单一些的方法,改成个可执行文件吗?

img

薛定谔_51的代码

img

我修改后的代码

Sub 保留线商品()

'选中单列整列、单列部分都支持
Dim rng As Range, arr, first_row, last_row, first_col, i, j, del_if As Boolean

'参数填写:arr,指定条件字符串数组;title_row,表头行数
'要删除的字符串数组,空值为删除空单元格,可使用模式匹配
arr = Array("6954767416021", "6923644266318", "6952032580910", "6971438767961", "6942863101682", "6901236385210", "218569310005067000", "218569310006075000", "6927787300359", "6901236382516", "6901668007193", "6948960101730", _
"6946026407925", "6920152400388", "6975291700066", "6907992508344", "6973575570251", "218569310005436000", "6972326010091", "6907992507385", "6940159490809", "6974261470220", "218569310009919000", "6923644268930", _
"16921168593566", "6971835290017", "6902538004069", "16921168558053", "6920202888869", "6921311145706", "6972352473105", "6920734706259", "6921311105021", "6958328822030", "6933505213252", "6907992501857", "6953264214215", _
"6907992512761", "6972688460480", "6925457201517", "6902884601110", "6901285991288", "6944910327366", "6941704415742", "6971227939071", "6974159590030", "6907992502052", "6933817306680", "6923644268916", "6957842000597", _
"6970399920422", "6920734726899", "6933735220280", "6925457200060", "75421", "6931216165556", "6972993610228", "6921311105175", "6903148253496", "6907992502199", "218569310008060000", "218569310008837000", "6958796801582", _
"6972847310267", "6934502301867", "6901285993299", "6971179644538", "218569310007890000", "6902083882433", "6971713510299", "6942717700917", "6923644286316", "6947612401242", "6923644240417", "218569310004641000", _
"6922868286591", "697883480354", "6944649700140", "6902884601103", "6937962116002", "6920734700783", "6972921770086", "6975197090001", "6927787300366", "6923644268909", "6930763971559", "6974268", "6970621266816", "127986", _
"4891028711964", "4897053952747", "6901285991233", "6901894121434", "6902083899356", "6902083918750", "6907992501864", "6907992513089", "6907992513393", "6907992513829", "6914068016146", "6917878030630", "6920734704583", _
"6920734708260", "6920734708307", "6920734749188", "6920734760169", "6921168594054", "6921294305029", "6921311145690", "6921311189458", "6921311189854", "6921311189885", "6921311189892", "6921311189991", "6921311193240", _
"6921555524589", "6921555531839", "6921555581742", "6922255400111", "6922266444739", "6923644210151", "6923644251475", "6923644283582", "6924254686305", "6925976700300", "6926892522175", "6926892524704", "6926892526197", _
"6927446240392", "6928395100447", "6936117601219", "6936667710365", "6940528700775", "6941287800614", "6941297456986", "6942686001008", "6942717701174", "6942863101712", "6944910322125", "6944910336573", "6945278000953", _
"6946594000153", "6948960100641", "6948960108043", "6949352201014", "6953964400185", "6954720601037", "6956367338604", "6956367338635", "6956367338659", "6956367338840", "6957598902091", "6958328820913", "6959539306630", _
"6970271980124", "6971590540266", "6971761970052", "6971918874905", "6971959380601", "6971959380724", "6972320170074", "6972374591009", "6972815920443", "6972815920481", "6973343218323", "6973355730059", "6974117450002", _
"6974396681911", "6974764090031", "6974891620002", "16920584471014", "218569310003229000", "218569310004653000", "218569310004829000", "218569310005080000", "218569310005257000", "218569310006249000", _
"218569310006344000", "218569310007574000", "218569310008047000", "218569310008227000", "218569310008273000")

title_row = 1        '表头行数,不执行删除
Set rng = Intersect(ActiveSheet.UsedRange, Selection)  'intersect语句避免选择整列造成无用计算
If rng.Columns.Count > 1 Then Debug.Print "仅支持单列": Exit Sub  '仅支持单列,多列则退出
first_row = WorksheetFunction.Max(title_row, rng.Row)  '表头行与选中区域开始行号的大值
last_row = rng.Row + rng.Rows.Count - 1  '选中区域结束行号
first_col = rng.Column  '选中区域开始列号

Range("J2:J10000").Select  '选择条码单元格区间
    For i = last_row To title_row + 1 Step -1  '倒序循环
        del_if = True   '初始为删除
        For Each j In arr
            '只要有一个符合,就不删除
            If Cells(i, first_col) Like j Then del_if = False: Exit For
        Next
        '都不符合,删除
        If del_if Then Rows(i).Delete
    Next
    For i = last_row To first_row Step -1  '倒序循环
        del_if = True    '初始为删除
        For Each j In arr
            If Cells(i, first_col) Like j Then del_if = False: Exit For
        Next
        If del_if Then Rows(i).Delete
    Next

End Sub

  • 写回答

2条回答 默认 最新

  • 薛定谔_51 2022-05-22 19:49
    关注

    代码都没看懂就用
    看你的描述,应该是在一列中的数据,和arr数组中存在的某个元素完全一致就删除该行
    如此,根本不用这么麻烦的代码
    倒序循环,用内置函数WorksheetFunction.Match()判断数组是否包含,再执行删除就行了

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 5月31日
  • 已采纳回答 5月23日
  • 修改了问题 5月22日
  • 创建了问题 5月22日

悬赏问题

  • ¥50 buildozer打包kivy app失败
  • ¥30 在vs2022里运行python代码
  • ¥15 不同尺寸货物如何寻找合适的包装箱型谱
  • ¥15 求解 yolo算法问题
  • ¥15 虚拟机打包apk出现错误
  • ¥15 用visual studi code完成html页面
  • ¥15 聚类分析或者python进行数据分析
  • ¥15 三菱伺服电机按启动按钮有使能但不动作
  • ¥15 js,页面2返回页面1时定位进入的设备
  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复