ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 4736|回复: 10

[求助] 用下面的代码把表里的NULL全部替换为0,不过老是不成功

[复制链接]

TA的精华主题

TA的得分主题

发表于 2015-9-25 22:06 | 显示全部楼层 |阅读模式
想用下面的代码把表里的NULL全部替换为0,不过老是不成功(只有第一行有效果)
请高人看看。谢谢!
WT.zip (23.54 KB, 下载次数: 22)





Sub test()
Dim res As ADODB.Recordset
Dim i   As Integer
Set res = New ADODB.Recordset
res.Open "Data", CurrentProject.Connection, adOpenDynamic, adLockOptimistic
res.MoveFirst
With res
For i = 1 To 10
   If IsNull(.Fields(i & "月")) Then
      .Fields(i & "月") = 0
   End If
Next i
.MoveNext
End With
End Sub


TA的精华主题

TA的得分主题

 楼主| 发表于 2015-9-26 10:00 | 显示全部楼层
请高人指点,非常感谢

TA的精华主题

TA的得分主题

发表于 2015-9-26 15:29 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-9-26 16:58 | 显示全部楼层
山中老人 发表于 2015-9-26 15:29
数据类型 是否匹配??

匹配的,运行也没有错误。谢谢!  请指点

TA的精华主题

TA的得分主题

发表于 2015-9-26 21:24 | 显示全部楼层
本帖最后由 山中老人 于 2015-9-27 05:48 编辑

你只有对字段(列)的循环,缺少对行的循环。当然只能处理第一行。
.MoveNext    .MoveFirst 都是针对记录(行)的操作。


你 那表设计也有问题,月份用文本类型,5月又用数字?
非常不严谨。要学会用【单步运行】调试(按F8键),很多问题自己就能解决。

Sub test()
Dim res As ADODB.Recordset
Dim i   As Integer
Set res = New ADODB.Recordset
res.Open "Data", CurrentProject.Connection, adOpenDynamic, adLockOptimistic
res.MoveFirst
Do While Not res.EOF
With res
For i = 1 To 10
   If IsNull(.Fields(i & "月")) Then
      .Fields(i & "月") = 0
   End If
Next i
.MoveNext
End With
Loop
End Sub



TA的精华主题

TA的得分主题

 楼主| 发表于 2015-9-27 11:52 | 显示全部楼层
山中老人 发表于 2015-9-26 21:24
你只有对字段(列)的循环,缺少对行的循环。当然只能处理第一行。
.MoveNext    .MoveFirst 都是针对记录 ...

1. 表设计方面的确是不规范 谢谢指点。

2. MOVENEXT就是移动到下一条记录(就是行),还需要用LOOP来调用。有点不理解
   不过现记住,后续慢慢理解。

非常感谢你的指点,顺祝节日快乐

TA的精华主题

TA的得分主题

发表于 2015-9-27 14:52 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 山中老人 于 2015-9-27 15:26 编辑

.Fields(i & "月")
实际是指的,某行的某个列(用EXCEL 来说就是一个单元格)。不是指的整个列(除非是新增(删除)该列)。

res.EOF 是用来测试行是否到了末尾。

多用VBA帮助(按F1键),上面都有说明的。
关于 DO .... loop 循环语句,见帮助。DO 代表循环开始,LOOP代表循环结束。
对于无法确定循环次数的,一般就用这种循环语句。
你用单步运行,跑一下程序,就知道为什么必须用了!
理论上也可以预先获取ADODB.Recordset 的行数(res.RecordCount),用FOR循环语句。
MaxC= res.Fields.Count  '总列数 :从res(0),到 res(MaxC-1)
MaxR = res.RecordCount '总行数
但是,一些特殊情况下,行数、列数是可能发生变化的。所以一般还是用 DO .... loop 循环语句,严谨一些。


TA的精华主题

TA的得分主题

 楼主| 发表于 2015-9-27 21:49 | 显示全部楼层
山中老人 发表于 2015-9-27 14:52
.Fields(i & "月")
实际是指的,某行的某个列(用EXCEL 来说就是一个单元格)。不是指的整个列(除非是新增 ...

谢谢高人耐心指点及分享。

原来Movenext不会主动向下一行移动(只是放了个“指针”在哪里),每次调用Movenext才能移动到下一行。

LOOP就是那个搬动“指针”的“手”。


非常感谢,顺祝节日快乐!

TA的精华主题

TA的得分主题

发表于 2015-9-28 07:25 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 山中老人 于 2015-9-28 07:42 编辑
andrewyang 发表于 2015-9-27 21:49
谢谢高人耐心指点及分享。

原来Movenext不会主动向下一行移动(只是放了个“指针”在哪里),每次调用 ...

Movenext 是向下一行移动指针,你执行一次就下移一次。

你用MoveFirst将指针移动到第一行,然后的操作都是针对这一行的
最后用Movenext,在它后面没有操作,也就没有意义。
执行Movenext,只是移动一下指针,并不意味着它会将上面的操作自动执行一遍。
必须用循环语句,再执行一遍上面的操作。才能发挥作用。 直到记录末尾,跳出循环。

循环语句(LOOP)本身不会去移动指针!移动指针还是靠Movenext。循环语句只是让其包括的语句重复执行。
看来你对循环语句还没有概念,需要补习一下编程基础。

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-10-4 19:56 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
山中老人 发表于 2015-9-28 07:25
Movenext 是向下一行移动指针,你执行一次就下移一次。

你用MoveFirst将指针移动到第一行,然后的操作 ...

谢谢指点,学习了。节日快乐!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-17 04:35 , Processed in 0.043449 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表