Tag: excel vba

将事件处理程序分配给在VBA中dynamic创build的用户表单上的控件

我发现互联网上的许多资源几乎做我想做的,但不完全。我有一个命名范围“daylist”。 对于dayList中的每一天,我想在用户窗体上创build一个button来运行当天的macros。 我能够dynamic添加button,但不知道如何将daycell.text从命名范围,button,事件处理程序传递到macros:S Heres我必须创build用户表单的代码: Sub addLabel() ReadingsLauncher.Show vbModeless Dim theLabel As Object Dim labelCounter As Long Dim daycell As Range Dim btn As CommandButton Dim btnCaption As String For Each daycell In Range("daylist") btnCaption = daycell.Text Set theLabel = ReadingsLauncher.Controls.Add("Forms.Label.1", btnCaption, True) With theLabel .Caption = btnCaption .Left = 10 .Width = 50 .Top = […]

匹配string数组中的值

问题:寻找一种更有效的方法来查找在1d数组中是否存在精确的匹配值 – 本质上是一个布尔值true/false 。 我可以忽略明显的东西吗? 或者我只是使用错误的数据结构,通过使用数组时,我可能应该使用集合对象或字典? 在后者中,我可以分别检查.Contains或.Exists方法 在Excel中,我可以检查vector数组中的值,如: If Not IsError(Application.Match(strSearch, varToSearch, False)) Then ' Do stuff End If 这将返回一个完全匹配的索引,显然受到Match函数的限制,它只能在这个上下文中find第一个匹配的值。 这是一种常用的方法,也是我长期以来使用的方法。 这对于Excel来说足够满意 – 但其他应用程序呢? 在其他应用程序中,我可以做基本相同的事情,但需要启用Excel对象库的引用,然后: If Not IsError(Excel.Application.match(…)) 这似乎很愚蠢,而且由于权限/信任中心/等原因很难在分布式文件上pipe理。 我曾尝试使用Filter()函数: If Not Ubound(Filter(varToSearch, strSearch)) = -1 Then 'do stuff End If 但是这个方法的问题是Filter返回一个部分匹配的数组,而不是一个完全匹配的数组。 (我不知道为什么这将是有用的返回子string/部分匹配。) 另一种方法是从字面上遍历数组中的每个值(这也是我认为非常常用的) – 这看起来比调用Excel的Match函数更加不必要的繁琐。 For each v in vArray If v = strSearch […]

如果单元格不包含“@”,则删除整行的有效方法

我正在创build一个快速的子邮件进行有效性检查。 我想删除“E”列中不包含“@”的整行联系人数据。 我使用了下面的macros,但是它的运行速度太慢,因为Excel在删除之后移动了所有的行。 我试过另一种技术: set rng = union(rng,c.EntireRow) ,然后删除整个范围,但是我不能防止错误信息。 我也尝试过将每行添加到select中,并且在select了所有内容之后(如在Ctrl + Select中),随后将其删除,但找不到适当的语法。 有任何想法吗? Sub Deleteit() Application.ScreenUpdating = False Dim pos As Integer Dim c As Range For Each c In Range("E:E") pos = InStr(c.Value, "@") If pos = 0 Then c.EntireRow.Delete End If Next Application.ScreenUpdating = True End Sub

通过VBA复制另一个工作簿中的数据

这就是我想要做的事情,而且我有点麻烦。 我有一个工作簿,我想从不同的文件收集数据做这样的事情。 Do While THAT_DIFFERENT_FILE_SOMEWHERE_ON_MY_HDD.Cells(Rand, 1).Value <> "" And Rand < 65536 then 'I will search if the last row in my main worksheet is in this file… End Loop 如果是这样,我会退出While循环,如果不是,我会复制一切。 其实这不会像我想要的那样工作,但我不会find正确的algorithm的麻烦。 我的问题是,我不知道如何访问不同的工作簿。

Excel函数在工作表数据上进行类似SQL的查询?

我在excel工作表中有一个较大的表格: Column_1 | Column_2 | Column_3 ValueA ValueB ValueC …. 我需要的是一个函数,将作为input的范围和类似SQL的查询string,并返回匹配查询的行范围,例如: =SQL_SELECT(A1:C1000, "SELECT * WHERE Column_1 = ValueH AND Column_3 = blah") 有这样的事情吗? 或者什么是实施自己的最佳方式? 谢谢

使用VBA在excel中融化/重塑?

我正在调整一个新的工作,我与同事分享的大部分工作都是通过MS Excel进行的。 我经常使用数据透视表,因此需要“堆叠”的数据,就是我为此所依赖的R中reshape (reshape2)包中的melt()函数的输出。 任何人都可以让我开始在VBAmacros来完成这个,还是已经存在? macros观纲要是: 在Excel工作簿中select一个单元格范围。 开始“融化”的macros。 macros将创build一个提示,“inputID列的数量”,在那里你可以input识别信息的前几列。 (例如下面的R代码是4)。 在标题为“melt”的excel文件中创build一个新的工作表,用于堆叠数据,并创build一个名为“variable”的新列,与原始select的数据列标题相同。 换句话说,输出看起来和R中简单执行这两行的输出完全一样: require(reshape) melt(your.unstacked.dataframe, id.vars = 1:4) 这是一个例子: # unstacked data > df1 Year Month Country Sport No_wins No_losses High_score Total_games 2 2010 5 USA Soccer 4 3 5 9 3 2010 6 USA Soccer 5 3 4 8 4 2010 5 CAN Soccer 2 […]

在VBA(excel)中循环行的最有效/最快捷的方法是什么?

我知道Excel中的VBA不是最快的东西 – 但是我需要最有效的(即最快的)方法来循环大量样本行。 目前我有: For Each c In Range("$A$2:$A$" & Cells(Rows.count, "A").End(xlUp).row ' do stuff Next c “做的东西”包括在这里和那里插入一行(所以我需要保持范围的dynamic查找。) 任何想法(看10,000行+)? 编辑我已经在使用 Application.ScreenUpdating = False Application.Calculation = xlManual

如何从VBA函数返回结果

如何从函数返回结果? 例如: Public Function test() As Integer return 1 End Function 这给编译错误。 我如何使这个函数返回一个整数?

popupExcel状态栏?

我正在开发一个需要很长时间才能运行的excel应用程序,所以最好有一个进度条popup来,并给出一些进度指示。 我正在看Excel中的Statusbar属性,它似乎涵盖了我所需要的,除了它不是很明显,即它是在左下angular的一个小小的通知,如果我没有想到我不会注意到我觉得很不满意。 有没有办法让状态栏popup一个新的MsgBox样式窗口类似于您可能期望在Windows上的文件传输? 实际显示在Excel表格中的进度条types对象并不理想,我正在寻找更好的解决scheme。 我在Windows上使用Office 2010。

“用户定义types未定义”错误

试图执行这个macros时出现上述错误。 我对macros和编码都很陌生,所以请原谅无知。 谢谢 Sub DeleteEmptyRows() Dim oTable As Table, oRow As Row, _ TextInRow As Boolean, i As Long Application.ScreenUpdating = False For Each oTable In ActiveDocument.Tables For Each oRow In oTable.Rows TextInRow = False For i = 2 To oRow.Cells.Count If Len(oRow.Cells(i).Range.Text) > 2 Then 'end of cell marker is actually 2 characters TextInRow […]