优化代码以最小化宏的运行时间

2023-12-29

我一直在编写一些宏来执行一些占星计算(计算星座、月亮宫、D9 和 D60)。原始数据的格式如下:

上图中的lng代表经度,以度、分、秒的格式表示。输出必须采用以下格式:

我编写了以下代码来从输入表中读取数据并格式化并将其复制到输出表中,然后使用每个行星的经度进行计算以计算所需的字段。

Sub prepareOutput()
Application.ScreenUpdating = False
Dim c, count, d, l, ll
Dim r As Range
Set r = Worksheets("Ephemerides").Range("a4:" & Worksheets("Ephemerides").Range("a4").End(xlDown).Address)
Worksheets("output").Range("a3").Value = "Date"
For Each d In r
    Worksheets("output").Cells(d.Row, 1).Value = d.Value
Next

For Each c In Worksheets("Ephemerides").Range("d2:o2")
    If Not IsEmpty(c) Then
        count = count + 5
        'MsgBox count
        If count = 5 Then
            Worksheets("output").Cells(2, 2).Value = c.Value
            Worksheets("output").Cells(3, 2).Value = "Longitude"
            Worksheets("output").Cells(3, 3).Value = "Sign"
            Worksheets("output").Cells(3, 4).Value = "Nakshatra"
            Worksheets("output").Cells(3, 5).Value = "Navamsa"
            Worksheets("output").Cells(3, 6).Value = "D60"
            For Each l In Worksheets("Ephemerides").Range(c.Offset(2, 0), c.End(xlDown).Address)
                Worksheets("output").Cells(l.Row, 2).Value = l.Value
                Worksheets("output").Cells(l.Row, 3).Value = calcSign(l.Value)
            Next
            count = 2
        Else
            Worksheets("output").Cells(2, count).Value = c.Value
            Worksheets("output").Cells(3, count).Value = "Longitude"
            Worksheets("output").Cells(3, count + 1).Value = "Sign"
            Worksheets("output").Cells(3, count + 2).Value = "Nakshatra"
            Worksheets("output").Cells(3, count + 3).Value = "Navamsa"
            Worksheets("output").Cells(3, count + 4).Value = "D60"
            For Each ll In Worksheets("Ephemerides").Range(c.Offset(2, 0), c.End(xlDown).Address)
                Worksheets("output").Cells(ll.Row, count).Value = ll.Value
                Worksheets("output").Cells(ll.Row, count + 1).Value = calcSign(ll.Value)
            Next
        End If
    End If
Next
Application.ScreenUpdating = True
End Sub



Private Function deg2dec(deg As String) As Variant
d = Val(Mid(deg, 1, InStr(deg, "°") - 1))
m = Val(Mid(deg, InStr(deg, "°") + 1, 2)) / 100
deg2dec = d + m
End Function


Private Function calcSign(deg As String) As String
dec = deg2dec(deg)
Select Case dec
    Case 0 To 30
        calcSign = "Aries"
    Case 30 To 60
        calcSign = "Taurus"
    Case 60 To 90
        calcSign = "Gemini"
    Case 90 To 120
        calcSign = "Cancer"
    Case 120 To 150
        calcSign = "Leo"
    Case 150 To 180
        calcSign = "Virgo"
    Case 180 To 210
        calcSign = "Libra"
    Case 210 To 240
        calcSign = "Scorpio"
    Case 240 To 270
        calcSign = "Saggitarius"
    Case 270 To 300
        calcSign = "Capricorn"
    Case 300 To 330
        calcSign = "Aquarius"
    Case 330 To 360
        calcSign = "Pisces"
End Select
End Function

上面的代码不会计算所有 4 个计算字段,目前仅计算一个。

我遇到的问题是我的输入表中有 24000 行和 12 列,将这些数据复制到输出表然后对其进行计算以计算另一个值需要花费大量时间。从一个经度值计算另外 3 个字段。

因此,如果你们可以看一下代码并让我知道如何最大限度地减少这里的运行时间,那将会有很大帮助。

如果有人想看的话,这是该工作簿的链接。星图xlsm https://drive.google.com/file/d/0B8OgQf1g9iFqWXVUU001ZFNKVWM/edit?usp=sharing

预先感谢所有抽出时间回复的人。

Cheers


以下是一些会对您的代码执行时间产生巨大影响的提示:

  1. Use Option Explicit并将变量声明为最合适的日期类型 - 仅使用Variant当你需要的时候。
  2. 将数据存储为数字(而不是字符串)并使用单元格格式根据需要显示
  3. 不要循环(大)范围。将范围数据复制到变体数组中,然后循环该数组。将结果复制回最后的工作表中。 SO 和其他地方有很多这样的例子。

要将数字显示为度分秒,请使用数字格式[h]°mm'ss\"这利用了时间格式,因此您需要将数值创建为Deg/24 + Min/1440 + Sec/86400 Eg 293°44'23"有价值12.2391550925926

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

优化代码以最小化宏的运行时间 的相关文章

  • Outlook 无法识别一个或多个姓名

    我有以下 vba 代码 它读取邮箱并向任何发送无效代码作为邮箱回复的用户发送回复 但有时会收到运行时错误 Outlook 无法识别一个或多个名称 我的问题是 创建新的 MAPI 配置文件是否可以解决该问题 或者我是否需要添加一个代码来解析地
  • 根据单元格值向用户窗体添加复选框

    我对 VBA 很陌生 只有 3 天 但我发现它非常有用且易于使用 但现在我面临一个问题 我需要制作一个具有不同复选框的用户窗体 但我需要根据工作表某一列中使用的信息自动添加它们 我相信我可以使用 For Each Next 但我真的不知道如
  • 如何使用VBA根据条件删除Excel中的行?

    我目前正在构建一个宏来格式化数据表并删除不适用的数据行 具体来说 我希望删除列 L ABC 的行以及删除列 AA DEF 的行 到目前为止 我已经实现了第一个目标 但还没有实现第二个目标 现有代码是 Dim LastRow As Integ
  • 在 VBA Excel 中查找、剪切和插入行以匹配借项和贷项值

    我在 Sheet1 中有以下设置数据 并从第 4 行 A 列开始 其中标题位于第 3 行 No Date Code Name Remarks D e b i t Cr e d i t 1 4 30 2015 004 AB 01 04 15
  • 使用 MID、LEN 和 FIND 函数提取单元格文本的某些部分?

    我有一份 Excel 作业 但我陷入了最后部分 我被要求使用 MID LEN 和 FIND 来提取单元格内的特定字符串 我非常了解每个人的工作方式 将这三者结合起来并让它们发挥作用是我遇到的问题 我需要将城市与地址的其余部分分开 然后将其显
  • 在二维范围内查找匹配的公式

    我需要一个公式来查找二维范围内的值并返回匹配单元格的坐标或单元格地址 例如 R A B C 1 John Matt Pete 2 Sara Bret Chad 3 Lila Maya Cami 我想搜索范围A1 C3 for Chad并返回
  • VBA中的字符串是可以迭代的数组吗?

    VBA中字符串是数组吗 例如 我可以像在 C C 中那样迭代它吗 做这样的事情 char myArray 10 for int i 0 i lt length i cout lt lt myArray i VBA 中的等价物是什么 它的行为
  • Excel VBA - 添加自定义数字格式

    我有一个在 Excel 外部生成的文件 其中包含许多百分比 所有这些百分比都有一位小数 当导入到 Excel 中时 Excel 会在百分比中添加第二位小数 这似乎是 Excel 中百分比的某种默认格式 它只是添加了一个 0 我想将所有两位小
  • 如何在 VBA 中声明接受 XlfOper (LPXLOPER) 类型参数的函数?

    我在之前的回答里发现了问题 https stackoverflow com q 19325258 159684一种无需注册即可调用 C xll 中定义的函数的方法 我之前使用 XLW 提供的注册基础结构 并且使用 XlfOper 类型在 V
  • numpy NPV 和 Excel NPV 有区别吗?

    我的 Excel 中有一行包含 11 个值 TotalSavings 0 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 贴现率为 0 08 我在 Excel 中使用 计算 NPVNPV
  • 如果总和为 0,则查找并删除带标题的最后一列

    我想创建一个宏 查找带有标题的最后一列 并仅当该列的总和等于零时才将其删除 到目前为止 这是我尝试过的 Dim LastCol As Long Dim i As Long With ThisWorkbook Sheets Sheet1 Fo
  • VBA在多个文件夹中搜索特定子文件夹并移动其中的所有文件

    你能帮助我吗 我想要一个宏vba来搜索SPECIFIC例如 所有存在并移动其文件的文件夹和子文件夹之间的子文件夹 Xfolder P Desktop Folder1 subfolder SUBFOLDER1 Xfolder 我正在使用 VB
  • 支持 >65k 行的 Excel VBA SQL 驱动程序

    在 Excel 2010 中通过 VBA 查询 Excel 数据时 我遇到一个有趣的问题 我正在使用这些驱动程序连接到 xls 或 xls x m 文件 Sub OpenCon ByRef theConn As Connection ByV
  • Redim Preserve 给出“下标超出范围”

    我想要Redim Preserve一个数组我不断收到错误 下标超出范围 我知道只有最后一个维度的大小可以更改 这正是我正在做的事情 这里出了什么问题 数组的类型是Variant BmMatrix Sheets BENCH Range a60
  • 使用宏打开受信任文档或启用宏时 Excel 崩溃

    正如标题所示 我无法使用宏打开受信任的文档 Excel 立即崩溃 制作文档的副本允许其打开 因为该副本不受信任 并且我可以检查 VB 编辑器中的宏 但启用宏会导致另一次崩溃 为什么会发生这种情况以及我可以采取什么措施来解决它 我今天遇到了类
  • Excel 2013 数据透视表不会更改当前页面,除非手动导航到

    我们有一小段 VBA 代码 多年来一直完美运行 本质上是 Me PivotTables APivot PivotFields AField CurrentPage Some text 这种方法一直有效 直到 Excel 2013 该行将失败
  • 使用 VBA 通过 Access 导航网页/操作 IE

    你好 StackOverflow 社区 我有一个关于使用 Access VBA 操作 IE 的问题 本质上 我正在尝试编写代码 使用 IE 打开特定网页 在该页面中搜索特定链接 目标链接的名称将取决于用户的情况 通过以编程方式单击该链接导航
  • Excel - 在一列中查找重复项,然后将数量求和到另一列中?

    查找一列中的重复项 然后将数量求和到另一列中 https i stack imgur com AADjd png DATA RESULT A 1 A 11 A 1 B 7 A 9 C 5 B 2 D 4 B 2 E 8 B 3 C 5 D
  • 替换字符串变量中的多个字符 (VBA)

    如何替换字符串变量中的多个内容 这是我在 VBA 中的示例函数 Private Function ExampleFunc ByVal unitNr As String If InStr unitNr OE gt 0 Then unitNr
  • VBA / HTML / jQuery 选择自动完成 - 在列表中选择

    我正在尝试使用 Excel 中的 VBA 在网站的列表中选择一个值 这不是一个 正常列表 该网站使用 jQuery 选择自动完成 如下所示 example http davidwalsh name demo jquery chosen ph

随机推荐

  • 拟合具有多个 LHS 的线性模型

    我是 R 新手 我想用以下脚本来改进 apply函数 我读过apply 但我无法使用它 我想用lm多个自变量 数据框中的列 的函数 我用了 for i in 1 3 assign paste0 lm names data i lm form
  • 在 PHP 中,如何找到一个数组中不在另一个数组中的元素?

    有没有一个类似于 array merge 的 php 函数 其作用完全相反 换句话说 我有两个数组 我想从第一个数组中删除第二个数组中存在的任何值 我可以通过循环迭代来做到这一点 但如果有一个方便的函数可以做同样的事情 那将是首选 Exam
  • JSF 2.0 在 commandLink 和 commandButton 上导航不起作用

    我正在使用 JSF 2 0 并且在 commandLink 和 commandButton 之后的导航时遇到问题 我使用以下代码
  • 将用户输入设置为变量名称[重复]

    这个问题在这里已经有答案了 我正在使用 python 想知道是否可以向用户询问变量的名称 然后使用该名称创建一个变量 例如 my name input Enter a variable name for example the user c
  • 如何获取所有已打开的子窗口的引用

    我想获取所有已打开的子窗口的引用 有什么办法吗 我没有使用child window open 只是使用window open 并打开多个子窗口 如果您不想更改当前代码 只需覆盖即可window open 功能 var openedWindo
  • 带有 magrittr tee 运算符的多个 ggplots

    我试图找出为什么当我将数据传递给 ggplot 命令时 tee 运算符 T gt 不起作用 这很好用 library ggplot2 library dplyr library magrittr mtcars T gt qplot x cy
  • 为什么我能够从本地主机上传到 AWS S3,但不能从 AWS Elastic BeanStalk 实例上传到 AWS S3?

    我正在使用 AWS Credentials 连接到我的 AWS S3 final AmazonS3 s3 new AmazonS3Client new AWSStaticCredentialsProvider new BasicAWSCre
  • 加速度计数据:如何解读?

    我正在试验 3 个加速度计分线板 X和Y轴非常容易控制 但Z轴有点神秘 我正在尝试找到一种解释代码中数据的方法 以在设备在空中升起时增加输出 并在设备下降时减少输出 这可能吗 如果是这样 怎么办 也许如果有人能给我指出一个好的参考来源会有帮
  • 循环遍历 numpy 数组中的每个项目?

    我正在尝试访问 numpy 二维数组中的每个项目 我习惯了 Python 中类似的东西 for row in data for col in data print data row col 但现在 我有一个data array np arr
  • 需要将 MS Visual C++ 移植到 Linux G++

    首先我想说我是一名计算生物物理学家 而不是软件工程师 所以我的编程知识仅限于科学计算 我使用 C Matlab 和 R 最近 我被要求将一个巨大的代码包 约 10 000 行 从 MS Visual C 移植到 Linux 我一直在其中开发
  • 以 Jenkins 用户身份部署或允许 Jenkins 以不同用户身份运行?

    我刚刚开始使用 Jenkins CI 有一个问题 努力在文档或在线中寻找答案 想知道是否 有人可以提供一些建议吗 我正在尝试使用它来自动部署我的开发和阶段 我的 Django 项目的分支托管在 Github 上 组织存储库 即私有 目前我有
  • 尝试将 pdfstamper 中的内存流获取到 pdfreader 中,但得到:“未找到 PDF startxref”

    我正在用 C 编写一个应用程序 它填充一堆 pdf 表单 将它们连接起来 然后放入一些页码 我在处理 pdfstamper 的内存流结果时遇到困难 如果我将内存流更改为文件流 它可以正常工作 但我不想使用文件系统 我创建了以下代码片段来重现
  • 添加 Twitter 组件时出现错误且网站无法加载

    在添加 Twitter 组件时 我得到了Uncaught ReferenceError process is not defined在我的 React Hooks Web 应用程序中 有人可以就这个问题提出建议吗 我尝试在下面添加windo
  • 如何使用直接流在Kafka Spark Streaming中指定消费者组

    如何使用直接流 API 为 kafka Spark 流指定消费者组 ID HashMap
  • 以编程方式禁用和启用 Android 中 Activity 的方向更改

    我有一个应用程序可以做一些后台人员 当后台工作正在运行时 会显示进度圈 如果设备在此期间旋转 则活动将 重置 我想避免这种情况 因此 我决定在此过程中禁用定向 我已经看到了这个问题的不同线程 但没有一个有效的解决方案 至少在我的情况下是这样
  • 使用 Room 进行动态排序

    我想使用 room 创建一个动态查询 以便在一种情况下查询返回特定的订单类型 并且在运行时如果订单类型发生更改 则会创建一个新查询 并根据此类型按顺序返回数据 我正在使用 Room 返回 DataSource Factory 对象 我正在使
  • 可存储向量和未装箱向量之间的差异

    所以 我使用了未装箱的向量 来自vector包 最好现在就不用考虑太多 vector th unbox让为它们创建实例变得轻而易举 所以为什么不呢 现在我遇到了一个实例 我无法自动派生这些实例 这是一种带有幻像类型参数的数据类型 如Vect
  • 如何使图像 100% 适合大屏幕

    我有以下 HTML div class jumbotron div class container h1 Souplesse h1 p Be a Good Sport p div div 以及以下 CSS jumbotron backgro
  • 精灵的对角线运动

    如何实现精灵的对角线移动 我创建了一个可移动的精灵 一个矩形 它向四个方向移动 为了使矩形具有动画效果 使用了计时器对象和动作执行方法 我在 keyPressed 和 keyReleased 方法中实现了以下代码 以将其向四个方向移动 pu
  • 优化代码以最小化宏的运行时间

    我一直在编写一些宏来执行一些占星计算 计算星座 月亮宫 D9 和 D60 原始数据的格式如下 上图中的lng代表经度 以度 分 秒的格式表示 输出必须采用以下格式 我编写了以下代码来从输入表中读取数据并格式化并将其复制到输出表中 然后使用每