Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 5864|回复: 11

VBA 本人小白双重for循环一直出错,请各位不吝赐教

[复制链接]
发表于 2020-5-24 21:28 | 显示全部楼层 |阅读模式
3学分
本帖最后由 PolarisBeimin 于 2020-5-25 13:50 编辑

图中的j一直不增加,一直j=2,不知道各位有什么解决方法,我是刚入门的小白,麻烦各位前辈可以直接写一下代码,谢谢了
以下是代码原文
Sub 自动生成()
Application.ScreenUpdating = False
    Dim i, j As Integer
        For j = 2 To 22
        For i = 2 To 22
            If Sheet2.Cells(i, 1) = "" Then
                Sheet2.Cells(i, 1) = Sheet1.Cells(j, 1)
            End If
            
            If Sheet2.Cells(i, 2) = "" Then
                Sheet2.Cells(i, 2) = Sheet1.Cells(j, 2)
            End If
            
            If Sheet2.Cells(i, 3) = "" Then
                Sheet2.Cells(i, 3) = Sheet1.Cells(j, 3)
            End If
        Next
        Next
Application.ScreenUpdating = True
End Sub

背单词.zip

30.28 KB, 下载次数: 7

最佳答案

查看完整内容

那就改成: For i = 2 To 11 If Not IsEmpty(Sheet1.Cells(i, 1)) Then Sheet2.Cells([a2].End(4).Row + 1, 1) = Sheet1.Cells(i, 1) Sheet2.Cells([a2].End(4).Row, 2) = Sheet1.Cells(i, 2) Sheet2.Cells([a2].End(4).Row, 3) = Sheet1.Cells(i, 3) End If Next 还是不能判断是否重复,多按一次就多写一天; 如果你 ...
发表于 2020-5-24 21:28 | 显示全部楼层
本帖最后由 hfwufanhf2006 于 2020-5-25 16:02 编辑
PolarisBeimin 发表于 2020-5-25 15:13
前辈您好,麻烦了谢谢,效果有一点偏差,您的代码运行后直接sheet1新学的10个单词直接出现在第365天的下 ...

那就改成:

        For i = 2 To 11
            If Not IsEmpty(Sheet1.Cells(i, 1)) Then
                Sheet2.Cells([a2].End(4).Row + 1, 1) = Sheet1.Cells(i, 1)
                Sheet2.Cells([a2].End(4).Row, 2) = Sheet1.Cells(i, 2)
                Sheet2.Cells([a2].End(4).Row, 3) = Sheet1.Cells(i, 3)
            End If
        Next


还是不能判断是否重复,多按一次就多写一天;
如果你发现写多了,就手工把重复的删掉,再重写;

这个代码也有潜在的问题,如果你一天所学的单词不够10个,那写入的数量也是不够10个,下一次再写,位置可能会出现偏差,因此用计算式可能更好些,把行参数 [a2].End(4).Row 改成:
(int([a2].End(4).Row/11)+1)*11+2
解释:
每一天占用11行,最末行是[a2].End(4).Row,所在的天数就是 [a2].End(4).Row/11,这不是个整数,比如最末行是第40行,40/11=3.6
int(3.6)+1=4,还原成第 4 天
(int(3.6)+1)*11,就是第4天的最末行
第 5 天还有一个标题,所以写入要在 (int(3.6)+1)*11+2

回复

使用道具 举报

发表于 2020-5-24 21:59 | 显示全部楼层
i 每次循环(2 to 22)后,j 会增加,内循环和外循环不是同步的,如果我没猜错,你可能只要一个循环。
  1. Sub 自动生成()
  2. Application.ScreenUpdating = False
  3.     Dim i As Integer
  4.         For i = 2 To 22
  5.             If Sheet2.Cells(i, 1) = "" Then
  6.                 Sheet2.Cells(i, 1) = Sheet1.Cells(i, 1)
  7.             End If
  8.             
  9.             If Sheet2.Cells(i, 2) = "" Then
  10.                 Sheet2.Cells(i, 2) = Sheet1.Cells(i, 2)
  11.             End If
  12.             
  13.             If Sheet2.Cells(i, 3) = "" Then
  14.                 Sheet2.Cells(i, 3) = Sheet1.Cells(i, 3)
  15.             End If
  16.         Next
  17. Application.ScreenUpdating = True
  18. End Sub
复制代码
回复

使用道具 举报

 楼主| 发表于 2020-5-24 22:50 | 显示全部楼层
大灰狼1976 发表于 2020-5-24 21:59
i 每次循环(2 to 22)后,j 会增加,内循环和外循环不是同步的,如果我没猜错,你可能只要一个循环。

是我描述的不准确,那个j也是需要不断由1到2到3不但变动的,我最开始也是写的和您的一样,但是达不到效果,所以才将j写为变量的
回复

使用道具 举报

发表于 2020-5-25 10:05 | 显示全部楼层
正常只要一层循环,双层循环的写法很怪异,没有附件看不出你要干什么?
回复

使用道具 举报

 楼主| 发表于 2020-5-25 13:50 | 显示全部楼层
hfwufanhf2006 发表于 2020-5-25 10:05
正常只要一层循环,双层循环的写法很怪异,没有附件看不出你要干什么?

好的谢谢,我上传一下附件说明一下我想干啥,我每天在sheet1 记忆区域背10个单词,然后运行宏在sheet2 记忆区背的单词会出现在储存区,具体位置会在储存区为空的下面单元下面进行,(也就是判断单元格是否为空,如果是空就将sheet1背诵的“移到”sheet2),目前遇到的问题就是只会对一个单词的音标和含义进行“复制”,另外还有一个问题就是,我现在还不知道怎么将当天的10个单词“复制”完后就停下,否则代码会一直运行下去。希望前辈不吝赐教
回复

使用道具 举报

发表于 2020-5-25 14:50 | 显示全部楼层
本帖最后由 hfwufanhf2006 于 2020-5-25 14:51 编辑
PolarisBeimin 发表于 2020-5-25 13:50
好的谢谢,我上传一下附件说明一下我想干啥,我每天在sheet1 记忆区域背10个单词,然后运行宏在sheet2 记 ...

不知道是不是这个意思?

For i = 2 To 22                    '读取sheet1 第 1 到 22 行,如果是任意行,可以用 sheet1.cells(i,1).end(3).row
       If Not IsEmpty(Sheet1.Cells(i, 1)) Then    'sheet1的 a 列不为空。如果用 .End(3).Row,这个条件也可省略
          Sheet2.Cells(Sheet2.[a10000].End(3).Row + 1, 1) = Sheet1.Cells(i, 1)      '在 sheet2 末尾行的下一行写入
          Sheet2.Cells(Sheet2.[a10000].End(3).Row, 2) = Sheet1.Cells(i, 2)            '已添加了新行,这里不能再添加了
          Sheet2.Cells(Sheet2.[a10000].End(3).Row, 3) = Sheet1.Cells(i, 3)
       End If
Next


.End(3).Row 是 .end(xlup).row 的意思,我习惯用数字;
上述代码总是在 sheet2 的末尾行添加 sheet1 中的全部内容,执行一次添加一次,中间没有空行;
代码会有误操作的可能性,按一次和按多次并没有明显的识别判断;

回复

使用道具 举报

 楼主| 发表于 2020-5-25 15:13 | 显示全部楼层
hfwufanhf2006 发表于 2020-5-25 14:50
不知道是不是这个意思?

For i = 2 To 22                    '读取sheet1 第 1 到 22 行,如果是任 ...

前辈您好,麻烦了谢谢,效果有一点偏差,您的代码运行后直接sheet1新学的10个单词直接出现在第365天的下面(也就是最后),我想要的效果是比如,sheet2中第一天下面有10个单词第二天下面有10个单词,但是第三天下面没有,今天新学的10个单词出现在第三天下面,而不是最后第365天下面,麻烦了


回复

使用道具 举报

 楼主| 发表于 2020-5-25 16:50 | 显示全部楼层
hfwufanhf2006 发表于 2020-5-25 15:52
那就改成:

        For i = 2 To 11

谢谢,按照您的方法已经达到了效果,感谢
回复

使用道具 举报

 楼主| 发表于 2020-5-25 17:15 | 显示全部楼层
本帖最后由 PolarisBeimin 于 2020-5-25 18:11 编辑

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-27 10:51 , Processed in 0.345110 second(s), 10 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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