问题:我想知道哪个是Excel 2003 VBA中处理数组的最佳解决scheme 背景:我在Excel 2003中有一个超过5000行的macros。 在过去两年中,我已经创build了新的function,作为新的程序,这有助于分割代码,debugging,更改或添加到该function。 缺点是我在多个过程中使用了很多相同的基本信息,这要求我将它加载到多次存在细微差异的数组中。 我现在遇到了运行时间长的问题,所以我现在可以做一个完整的重写。 该文件用于获取多个制造stream程项目(最多4个不同的设置,总共多达10个不同的stream程,每个stream程最多1000步骤),其中信息是stream程特定的,子stream程专用于分组/sorting目的和数据(如移动,库存,CT,…) 然后,将数据粘贴到多张用于pipe理stream程的工作表上,利用要查阅的数据表,图表和单元格格式来表示stream程能力/历史logging。 stream程在Excel文件中,制造数据用7个不同的OO4O Oracle SQL读取读入,一些重复使用多次 arrays是: arrrFlow(1到1000,1到4)作为loggingtypes与4个string arrrSubFlow(1到1000,1到10)作为loggingtypes,包含4个string,2个整数和1个单 arrrData(1到1000,1到10)作为loggingtypes,有1个string,4个整数,12个长整数和1个单 arriSort(1到1000,1到4)为整数(用作指针数组,以分组顺序对子stream,子stream和数据进行sorting,同时按步骤顺序保留原始数组) 可能性: 1)将macros重写为一个大的过程,将数据加载到过程中定义的主数组中 临:在过程中的大小,而不是在模块中的公共variables,并没有通过。 Con:用一个大型程序而不是多个小型程序debugging更困难。 2)保持macros多个程序,但通过arrays 临:更容易debugging与多个较小的程序的代码。 Con:通过数组(昂贵?) 3)使用多个程序保持macros,但在模块中数组是公共调光的variables 临:更容易debugging与多个较小的程序的代码。 Con:公共arrays(昂贵?) 那么,社区的判决是什么? 有谁知道使用公共数组vsarrays的花费? 这些任何一个的成本是否值得让我的程序集中在一个function上? 更新: 我以离散级别(每步多个)加载库存数据,在总级别上移动数据(每个步骤一个),以及在总体级别上移动库存的开始。 我将库存数据一步一步放在工作状态类别(运行,等待,…)中,我已经在工作表上创build了目标数据。 我有一个stream程图,按types显示工作stream程,目前3个产品有类似但不完全相同的stream程,2个产品是不同的stream程,类似但又不相同。 我已经将不同stream程中的每一组步骤分配给一个组和一个子组。 我将这些数据放置在多个工作表中,一些在步骤顺序中,一些在组/子组顺序中。 我也需要集团和产品,集团/子集团和产品,线路和产品的一部分,以及产品总结的数据。 我使用loggingtypes,所以我实际上有一个可读的三维数组,arrSubFlow(1,1).strStep(第一个设备的第一步的步骤名称),arrData(10,5).lngYest(第十步的昨天的移动第五个设备)。 我的主要优化将在每一次从头创build10页的部分。 通过合并单元格,边界,标题,…这是一个非常耗时的过程。 我将添加一个将我的数据与页面进行比较以查看是否需要更改的部分,如果是,则只需重新创build它,我将清除数据的每个部分,并只写入更改到表单的数据。 这将是巨大的,根据我的时间logging数据。 但是,每当我更新代码时,我总是尝试改进代码的其他方面。 我看到数据加载到一个结构(数组,logging集,集合),既是一点点的优化,但更重要的是数据完整性,所以我没有机会以不同的方式加载不同的表。 我现在看到远离arrays的主要问题是: *已经投入很大,但这不是一个足以改变的理由 *不知道是否有太多的成本通过他们,因为它会由ByRef *我使用sortingfunction来创build一个sorting的“指针”数组,使我可以按步骤顺序离开数组,同时按组/子组顺序轻松引用它。 由于我总是试图为现在和未来做我的代码,我不反对将数组更新为RecordSet或Collections,而不仅仅是为了改变它们学习一些很酷的东西。 我的arrays工作,从我的研究,他们增加了几秒的运行时间,而不是2分钟的报告大量的。 所以,如果另一个结构比loggingtypes的二维数组更容易更新,那么请让我知道,但是有没有人知道把数组传递给一个过程的代价,假设你没有进行ByVal传递?
VBA是否支持使用范围variables数组? dim rangeArray() as range dim count as integer dim i as integer count = 3 redim rangeArray(1 to count) for i = 1 to count msgbox rangeArray(i).cells(1,1).value next 我不能让它在这种types的应用程序中工作。 我想按一定顺序存储一系列的范围作为“主副本”。 然后,我可以添加,删除,sorting或做任何事情,这个数组,然后打印出来的Excel中的一系列范围。 它似乎不像Excel支持这一点 – 它只是迫使你存储在电子表格中的数据,你必须重读它才能使用它。
所以我从一个旧的VSTO项目中find了我的一些代码,并注意到这一点: Excel.Worksheet sheet = Globals.ThisAddIn.Application.Worksheets["Unique Hits Per URL"]; Dictionary<int, string> ids = new Dictionary<int, string>(); object[,] cellRange = (object[,])sheet.get_Range("E:E").Cells.Value; for (int i = 1; i < cellRange.GetUpperBound(0); i++) if (cellRange[i, 1] != null) ids.Add(i, cellRange[i, 1].ToString()); 在数据types上指定[,]是什么意思? 看看代码,它看起来像一个matrixfunction,但老实说,我认为C#matrix处理像记号像[] []。
背景 接下来的一个问题是,我刚才问了一些关于如何得到一组不同的(但不一定是唯一的)随机数的答案: =RANDBETWEEN(ROW(A1:A10)^0,10) 获得1到10之间的10个随机数的数组 问题 如果我用上面的公式创build一个命名的范围(称为“randArray”),我希望我能够引用randArray许多次,并获得相同的随机数集。 当然,他们会改变每次我按F9或更新工作表 – 但一起改变。 这就是我所得到的,是两组完全不同的随机数 我对这种行为并不感到惊讶,但是如何在不使用VBA的情况下实现这一点, 也不需要将随机数字放在工作表上 ? 如果你有兴趣 这个例子旨在成为MCVE。 在我的实际情况中,我使用随机数来估计Pi。 用户规定应用多less个随机点并得到相应的准确估计。 出现这个问题的原因是我也绘制点,当有less量的点时,很清楚的是看到估计和图不代表相同的数据集 更新 我已经把@Michael的最初奖金授予了一个有趣和不同的解决scheme。 我仍在寻找一个完整的解决scheme,允许用户规定使用多less个随机点,虽然可能没有一个完美的答案,但我仍然对其他任何可能的解决scheme感兴趣,并且乐于提供更多的奖励。 感谢迄今为止所做的贡献。
我有一些现有的代码,我正在修改。 此代码从预先存在的工作表中创build一个行集合。 它创build了一个大型的二维集合,每列都有独特的信息。 有一个单独的类模块为每个列声明数据types。 该代码通过循环遍历每个项目,将2D集合写入新的工作表。 我从来没有使用过一个集合,并希望一次性将集合写入表单。 当表有很多logging时,当前代码需要相当长的时间。 有没有办法将整个集合转换成二维数组,或者让我可以一次写入二维数组? 还是有办法将整个集合写入表单,就像使用二维数组一样? 我试图寻找这个,迄今为止不成功。 任何一般的观点,将不胜感激! 下面是一些示例代码,用粗体注释来说明如何使用集合。 定义类模块,命名为TableEntry Public Item1 As String Public Item2 As String Public Item3 As String Public Item4 As Integer Public Item5 As Integer 主要例程 – 创build集合,填充集合,将集合写入表单 Sub MainRoutine() Dim table As Collection Set table = New Collection Call FillCollection(File As String, ByRef table As Collection) […]
我正在寻找一些在Excel的VBA中执行一些matrixmath的帮助。 我读了大量的build议使用Excel工作表的答复,但我希望在VBA代码本身内解决这个问题。 尽pipe我的应用程序要大得多,假设我有一个我需要解决的线性方程组: x1 + x2 = 8 2*x1 + 4*x2 = 100 这可以用简单的matrix公式A * x = B或x = A ^( – 1)* B来解决, A = [1, 1; 2, 4] B = [8; 100] 如果你解决这个问题,你会发现x1 = -34和x2 = 42。就matrix而言,则: X = [-34; 42] 使用Excel的工作表以及它的MMULT和MINVERSE函数使得这一切变得简单,我已经得到了它的工作。 我的问题是我需要做一个VBA函数内的这个计算。 这就是我想要的: Dim A(0 To 1, 0 To 1) As Single […]
我有一个整数值的数组,并希望find一个简单的方法来计算其累积和( S = Data(1) + Data(2) + … + Data(x) )。 我已经创build了这个function: Function CumulativeSum(Data() As Integer, k As Integer) As Integer For entry = 1 To k CumulativeSum = CumulativeSum + Data(entry) Next entry End Function 它工作正常。 但是,我不知道是否有更好的方法(主要是没有使用任何额外的function,并且基本上只使用像Application.Sum这样的Excel函数)。 我在网上做了一个小search,但没有在这个基础上find任何东西。 我知道我不是要求更正任何代码,而只是要求一个替代scheme,而不是这个论坛的真正目的。 不过,我也怀疑答案可能很简单,所以…如果有人关心帮助我,我会非常感激! 如果您发现类似问题的答案,请与我分享链接,我将删除这个链接。 我非常抱歉,可能是我缺less明确的需求:我只是想find一个简单的方法来计算累积和,使用macros函数本身的简单函数,而不使用我创build的CumulativeSum函数或任何其他函数用户。
我有一个函数在VBA中生成一个string数组。 从另一个VBA函数调用时,它工作正常,但从工作表中调用时没有问题。 以下是应该如何使用它: selectA1:A3 在公式栏中input=Test() ,然后Ctrl-Shift-Enter使其成为一个数组函数 A1应该包含A ,A2应该包含B ,而A3应该包含C 当我真正尝试这个时,它将A放在数组的所有三个单元格中。 我怎样才能得到Test返回到数组的不同单元格的数据? 对于那些想看到它的人来说,这里是函数的代码。 请记住,从其他函数调用时,该函数可以正常工作。 Function Test() As String() Dim a(1 To 3) As String a(1) = "A" a(2) = "B" a(3) = "C" Test = a End Function
我有这个2维数组,我想导出为Excel文件。 // create a simple 2-dimensional array $data = array( 1 => array ('Name', 'Surname'), array('Schwarz', 'Oliver'), array('Test', 'Peter') ); 问题是我不能预测数组中的键的数量,所以很难使用这种方法 $objPHPExcel->setActiveSheetIndex(0); $objPHPExcel->getActiveSheet()->SetCellValue('A1', 'Hello'); $objPHPExcel->getActiveSheet()->SetCellValue('B2', 'world!'); $objPHPExcel->getActiveSheet()->SetCellValue('C1', 'Hello'); $objPHPExcel->getActiveSheet()->SetCellValue('D2', 'world!'); 我正试图生成一个for循环,将这样做,任何帮助?
在VBA中, Evaluate()和[]方法都可以用来返回数组: Dim i As Variant i = Evaluate("{1,2;3,4}") i = [{1,2;3,4}] 两行设置i是一个二维数组包含数字1-4。 一个附加的function是Evaluate(…)(1,2)返回数组的R1C2索引元素(即2 – […](1,2)同时错误) 我想知道是否有任何语法评估数组返回工作表函数以相同的方式,例如 i = Evaluate("LEN(A1:A5)>3") 'or similar like [{LEN(A1:A5)>3}] 如果我在A4和A5文字长度超过3个字符,应该返回1D数组,如{False,False,False,True,True} ,但是不是。 如果没有,是否有另一种评估数组公式的方法来返回完整的数组? 我正在寻找任何方法提供最小的字符数。