Excel精英培训网

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

[已解决]动态的循环怎么设置?

[复制链接]
发表于 2024-2-13 20:39 | 显示全部楼层 |阅读模式
      先用for循环计算2015-2023年各种鸟的数量,表内蓝框数据正确。      再想统计2015年-2023年的新鸟数量,单独计算其中某一年的简单,只需要改一下当年的数据单元,但是统计这几年的,好像复杂了,原来逐句判断当前列前的每一项是否为零,我设了一个循环,但是统计出的数据不对,不知道问题出在哪里。红框H列存放新鸟数据,请老师们给予 指导。

最佳答案
2024-2-19 15:24
凤鸣岐山 发表于 2024-2-18 20:40
老师 好,H 列红框里的数据是正确值
86
55

With Sheet2                    With Sheets"分类统计" 直观
===================================
单元格 用 颜色来操作 的 方法 不推荐
重新写的, 按 手册号操作的

    ①【分类统计 】89 行 扇尾沙锥 的 手册号 应该 是错了
    ② 空白的 , 增加了几个, 算 修改了 数据源
a0.png
======================================
' 供 参考
Sub 综合统计_多年()
    Dim 列序_arr0, 鸟分类_arr0, 数据源_arr0, 结果_arr9(1 To 1000, 1 To 20), r0&, c0&
    Dim i&, j&, k&, 鸟分类$, 列9&
    Dim D_列序, D_鸟分类, D_发现
    Dim t

    t = Timer
    Set D_列序 = CreateObject("scripting.dictionary")
    Set D_鸟分类 = CreateObject("scripting.dictionary")
    Set D_发现 = CreateObject("scripting.dictionary")

    With ThisWorkbook
        With .Sheets("综合统计")
            列序_arr0 = .Range("B22:G22").Value
        End With

        For i& = 1 To UBound(列序_arr0, 2)
            D_列序(列序_arr0(1, i&)) = i&
        Next i&

        With .Sheets("手册鸟名录")
            鸟分类_arr0 = .Range("B3:F" & .Range("B3").End(xlDown).Row).Value
        End With

        For i& = 1 To UBound(鸟分类_arr0)
            D_鸟分类(鸟分类_arr0(i&, 1)) = 鸟分类_arr0(i&, 5)
        Next i&

        With .Sheets("分类统计")
            r0& = .Range("g65536").End(xlUp).Row
            c0& = .Range("IV2").End(xlToLeft).Column - 1
            数据源_arr0 = .Range("A1").Resize(r0&, c0&).Value
        End With

        For i& = 9 To c0& Step 3
            k& = k& + 1
            结果_arr9(k&, 1) = Left(数据源_arr0(2, i&), 4)      '年份
'            Stop
            For j& = 4 To r0&
                If 数据源_arr0(j&, i& + 1) <> 0 Then '有数据 (出现地点)

                    鸟分类$ = D_鸟分类(数据源_arr0(j&, 6))
                    列9& = D_列序(鸟分类$) + 1

                    If D_发现.Exists(数据源_arr0(j&, 6)) = False Then
                        '新拍
                        D_发现(数据源_arr0(j&, 6)) = 1    '
'                        If i& = 18 Then Debug.Print 数据源_arr0(j&, 6)
                        结果_arr9(k&, 8) = 结果_arr9(k&, 8) + 1     '新拍鸟
                        结果_arr9(1000, 列9&) = 结果_arr9(1000, 列9&) + 1   '新拍鸟 行累计

                    End If

                    结果_arr9(k&, 列9&) = 结果_arr9(k&, 列9&) + 1   '年度&分类 +1
                    结果_arr9(k&, 9) = 结果_arr9(k&, 9) + 1   '年度小计 +1

                End If
            Next j&
        Next i&

        k& = k& + 1
        结果_arr9(k&, 1) = "累计新鸟种数"
        For i& = 2 To 10
            结果_arr9(k&, i&) = 结果_arr9(1000, i&)
        Next i&
'        .Sheets("综合统计").Range("A24").Resize(1000, 12).Clear
        .Sheets("综合统计").Range("A24").Resize(k&, 11).Value = 结果_arr9
        .Sheets("综合统计").Select
'        Stop

    End With
    Debug.Print "用时 " & Timer - t & "秒"
End Sub






上传.png

石家庄- 专用2024论坛.rar

155.86 KB, 下载次数: 6

发表于 2024-2-17 16:09 | 显示全部楼层
无效内容太多.

屏蔽 其它内容 , 针对本贴 问题
1. 数据源 是?
2. 程序是 ?
3. 结果 哪个值 不对 , ( 举例到具体  单个单元格 ,  正确值又应该是什么?)


=============================================

假设 本帖 问题的 数据源 是"拍鸟清单"
那么 2016 猛禽 只有
100
455
16/4/8
105
512
燕隼
16/5/3
单元格 G25 应该 是 2

如果 "拍鸟清单" 是 数据源 , 那么所有的鸟 只有出现过一次 , 没有再次发现



回复

使用道具 举报

 楼主| 发表于 2024-2-18 19:38 | 显示全部楼层
老师好,这是求“分类统计”表里各年份数据的汇总,对应的是下边:  Sub 统计2024修改计算综合表换色后各年品种()。可能 是设置循环变量有问题,统计出来 的结果不对。
回复

使用道具 举报

 楼主| 发表于 2024-2-18 20:40 | 显示全部楼层
老师 好,H 列红框里的数据是正确值
86
55
30
10
7
14
13
15
18
。执行程序是:  Sub 统计2024修改计算综合表换色后各年品种()
回复

使用道具 举报

发表于 2024-2-19 15:24 | 显示全部楼层    本楼为最佳答案   
凤鸣岐山 发表于 2024-2-18 20:40
老师 好,H 列红框里的数据是正确值
86
55

With Sheet2                    With Sheets"分类统计" 直观
===================================
单元格 用 颜色来操作 的 方法 不推荐
重新写的, 按 手册号操作的

    ①【分类统计 】89 行 扇尾沙锥 的 手册号 应该 是错了
    ② 空白的 , 增加了几个, 算 修改了 数据源
a0.png
======================================
' 供 参考
Sub 综合统计_多年()
    Dim 列序_arr0, 鸟分类_arr0, 数据源_arr0, 结果_arr9(1 To 1000, 1 To 20), r0&, c0&
    Dim i&, j&, k&, 鸟分类$, 列9&
    Dim D_列序, D_鸟分类, D_发现
    Dim t

    t = Timer
    Set D_列序 = CreateObject("scripting.dictionary")
    Set D_鸟分类 = CreateObject("scripting.dictionary")
    Set D_发现 = CreateObject("scripting.dictionary")

    With ThisWorkbook
        With .Sheets("综合统计")
            列序_arr0 = .Range("B22:G22").Value
        End With

        For i& = 1 To UBound(列序_arr0, 2)
            D_列序(列序_arr0(1, i&)) = i&
        Next i&

        With .Sheets("手册鸟名录")
            鸟分类_arr0 = .Range("B3:F" & .Range("B3").End(xlDown).Row).Value
        End With

        For i& = 1 To UBound(鸟分类_arr0)
            D_鸟分类(鸟分类_arr0(i&, 1)) = 鸟分类_arr0(i&, 5)
        Next i&

        With .Sheets("分类统计")
            r0& = .Range("g65536").End(xlUp).Row
            c0& = .Range("IV2").End(xlToLeft).Column - 1
            数据源_arr0 = .Range("A1").Resize(r0&, c0&).Value
        End With

        For i& = 9 To c0& Step 3
            k& = k& + 1
            结果_arr9(k&, 1) = Left(数据源_arr0(2, i&), 4)      '年份
'            Stop
            For j& = 4 To r0&
                If 数据源_arr0(j&, i& + 1) <> 0 Then '有数据 (出现地点)

                    鸟分类$ = D_鸟分类(数据源_arr0(j&, 6))
                    列9& = D_列序(鸟分类$) + 1

                    If D_发现.Exists(数据源_arr0(j&, 6)) = False Then
                        '新拍
                        D_发现(数据源_arr0(j&, 6)) = 1    '
'                        If i& = 18 Then Debug.Print 数据源_arr0(j&, 6)
                        结果_arr9(k&, 8) = 结果_arr9(k&, 8) + 1     '新拍鸟
                        结果_arr9(1000, 列9&) = 结果_arr9(1000, 列9&) + 1   '新拍鸟 行累计

                    End If

                    结果_arr9(k&, 列9&) = 结果_arr9(k&, 列9&) + 1   '年度&分类 +1
                    结果_arr9(k&, 9) = 结果_arr9(k&, 9) + 1   '年度小计 +1

                End If
            Next j&
        Next i&

        k& = k& + 1
        结果_arr9(k&, 1) = "累计新鸟种数"
        For i& = 2 To 10
            结果_arr9(k&, i&) = 结果_arr9(1000, i&)
        Next i&
'        .Sheets("综合统计").Range("A24").Resize(1000, 12).Clear
        .Sheets("综合统计").Range("A24").Resize(k&, 11).Value = 结果_arr9
        .Sheets("综合统计").Select
'        Stop

    End With
    Debug.Print "用时 " & Timer - t & "秒"
End Sub






回复

使用道具 举报

发表于 2024-2-19 15:41 | 显示全部楼层
PS
本来打算 用中文鸟名,
但 vba 有文字 不能识别 , 如 蚁    " 䴕 "
回复

使用道具 举报

 楼主| 发表于 2024-2-22 18:43 | 显示全部楼层
砂海 发表于 2024-2-19 15:41
PS
本来打算 用中文鸟名,
但 vba 有文字 不能识别 , 如 蚁    " 䴕 "

老师的方法按规矩来的,条理更清晰,大概意思明白了,还需要再消化。
     我跑了一下,能够跑通,数据有一点出入,可能 是因为手册序号,手册名录是前些年的出版物,近些年陆续出现的鸟种,或者是新独立出来的鸟种,所以在分类统计表里就出现空白,造成序号不连续。
      谢谢老师指导!
回复

使用道具 举报

发表于 2024-2-25 10:34 | 显示全部楼层
凤鸣岐山 发表于 2024-2-22 18:43
老师的方法按规矩来的,条理更清晰,大概意思明白了,还需要再消化。
     我跑了一下,能够跑通,数据 ...

手册序号随版本不同的话, 或许该把手册名也带上
才能实现数据稳定可靠

个人觉得 数据源 长这样, 结构简单 ,  方便后续 的 统计与计算
a0.png
07 版 excel 表格 超过 100万 行, 数据量超过 这个 可以 考虑数据库
excel 有太多的 的 单元格 格式 , 导致表格 无效膨胀



回复

使用道具 举报

 楼主| 发表于 2024-3-5 20:53 | 显示全部楼层
砂海 发表于 2024-2-25 10:34
手册序号随版本不同的话, 或许该把手册名也带上
才能实现数据稳定可靠

老师好,我就是自己使用,数据量不大,但是每年都是这样重复,用不到数据库。
回复

使用道具 举报

发表于 2024-3-13 21:37 | 显示全部楼层
凤鸣岐山 发表于 2024-3-5 20:53
老师好,我就是自己使用,数据量不大,但是每年都是这样重复,用不到数据库。

...
假设 20年 , 50年 , 80年 .... 后 ,
对这些数据 进行分析 的话 , 手册改了几版的话 , 只有序号就麻烦了

==========
据我所知, 生物学有些分类 意见不统一

轮虫分类形态结构特殊,长期以来其分类地位各家意见不统一。多将其列为线形动物门Nemathelminthes的-·个纲,即轮虫纲 Rotifera。有的学者把这类假体整动物称为原体脖动物门Aschelminthes。现在很多学者将轮虫单独列为轮虫动物门 Phylum Rotifera。按照


也许 鸟类 没这些事 , 但凡事就拍万一
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 18:55 , Processed in 0.387928 second(s), 8 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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