Questions tagged «vba»

Visual Basic应用程序;所有Microsoft Office应用程序中使用的Visual Basic的子集。考虑将该标签与该特定应用程序的标签一起使用。关于VBA的好问题通常包含一些代码,并要求解决特定问题。要求完整解决方案的问题(请给我代码/如何使用VBA做到这一点)不在主题之内,将因为过于广泛而封闭。

2
除非手动更改单元格,否则Excel工作表更改事件不会触发
我使用以下代码,效果很好。但是,应该触发此事件的单元格的更改是使用公式而不是单元格中的条目。如果我输入条目,一切正常。但是,如果我使用公式从另一个工作表中获取数据,则不会。例如,AD中的细胞具有类似的公式 =HR!P27。 我错过了什么? 码: Private Sub Worksheet_Change(ByVal Target As Range) 'Update 20140722 Dim WorkRng As Range Dim Rng As Range Dim xOffsetColumn As Integer Set WorkRng = Intersect(Application.ActiveSheet.Range("AD:AD"), Target) xOffsetColumn = -1 If Not WorkRng Is Nothing Then Application.EnableEvents = False For Each Rng In WorkRng If Not VBA.IsEmpty(Rng.Value) Then …

2
Excel和VBA - 函数的底层代码在哪里?
我想知道在Excel或在线的任何地方,我可以使用它来查看Excel中的函数是如何工作的。 我的想法是,我开始学习如何制作UDF,并在VBA中做各种事情,并认为如果我能看到Excel实际执行的方式 Sum() 例如,我可以学习如何使我的代码更紧凑,占用更少的空间等。 基本上,Excel的内置函数如何工作的存储库?这甚至可用吗? 编辑:我知道公式可能用非VBA编写。那很好 - 我只是好奇是否有办法看到它们,无论它们是用什么语言写的。 编辑2:总的想法是我正在学习C ++ / VBA / C#,并且希望看到“官方”函数只是为了了解它们是如何工作的,并看看是否有任何方法可以加速代码。 OpenOffice功能也很好!


1
Excel 2003宏未看到命名单元格
我正在尝试清理我直接引用单元格的excel宏(“LoopCount = Range(”E4“)。值”)而不是使用命名单元格(“LoopCount = Cell_LoopCount”)。 所以我将单元格E4命名为“Cell_LoopCount”。每当我选择单元格E4时,它的标签就在左上角。 在宏的开头,我添加了“表格(”数据“)。选择”以确保我在正确的工作表上操作, 但是在“LoopCount = Cell_LoopCount”之后断开,显示Cell_LoopCount为空且LoopCount = 0 “LoopCount =范围(”E4“)。值”仍然可以正常工作 我错过了什么明显的事情?

1
添加/减去按钮Excel VBA
以下是此图片中我的项目示例 我喜欢收集,所以我在Excel中制作库存表。 我想创建一种方法,我可以单击一个按钮,它会影响下一个或上一个单元格 例如: 单元格C3将有一个Add按钮,单元格D3将具有该项目的副本数量,而单元格E3将具有一个Subtract按钮。通过单击C3中的按钮,它将向Cell D3中的数字添加一个。如果单击C1中的按钮,它将从单元格D3中减去。似乎很直接。 尽管如此: 我每张纸上有200件物品,如20张(不在示例中)。我想要一些方法,我可以将宏添加到所有按钮,而无需为每个按钮创建一个特定的新宏。我也不希望它与所选单元格一起使用。它需要影响添加按钮右侧的单元格和减法按钮左侧的单元格。 我到处寻找答案,我非常接近解决方案。 这是我能找到的最接近的东西,但它并不是我不喜欢的东西: Sub AddOne() ActiveCell.Value = ActiveCell.Value + 1 End Sub Sub SubtractOne() ActiveCell.Value = ActiveCell.Value - 1 End Sub 我希望这是有道理的,谢谢大家的时间。


1
从复杂字符串中提取数字(如果它在给定范围内)
我需要一个Excel公式(或VBA宏),该公式将允许我从字符串中提取值。字符串是单个单元格中由空格分隔的单词序列。我想要这个词(代表自行车的大小)是 47到60(或其他范围,可能是动态指定)之间的数字(可能是整数,但未指定),或者 字符串“ sm”,“ med”或“ lg”之一。 我希望在字符串中恰好有一个限定词,因此对它的任何合理的错误处理响应 没有限定词,或者 多个限定词 将是可以接受的。大小可以在字符串中的各个位置。例子: Cervelo车队P2 105 5800 56 '15 数 56 是所希望的结果 Cervelo车队P2 105 54 6000 '15 数 54 是所希望的结果 Cervelo车队P3 105 5800 60 '15 数 60 是所希望的结果 Cervelo车队P2 105 5800 SM '15 的字符串 sm 是期望的结果 我只对整个单词感兴趣,因此58(“ 5800”的子字符串)不符合条件。 现在,我要剥离'15并提取最后两位数字。但是,仅当自行车尺寸是倒数第二个值时,此方法才有效。但是,如上所述,在某些情况下,大小位于字符串中的其他位置。 如何在Excel中使用公式或VBA宏执行此操作?

1
Excel:在不同的计算机上打开同一文件时,VBA会报告不同的形状宽度
我为什么要挠头。两台计算机都运行Win7 pro 64位,以及相同版本的Excel(版本1708,Build 8431.2236)。电子表格中插入了8个图像。这就是我用来报告图像宽度的方法: For Each p In ActiveSheet.Shapes MsgBox ("TL row: " & p.TopLeftCell.Row & ", TL column: " & p.TopLeftCell.Column & " ,image width: " & p.Width) 这是我在两台计算机上得到的: computer 1 computer 2 14, 1, 72 14, 1, 73.2 157, 4, 379.5 157, 4, 386.4 182, 4, 379.5 182, …

2
使用Range.Replace的Excel 2010 Range.FormulaArray
我正在尝试自动化一些日常工作,我使用INDEX()+ MATCH()数组公式将一些数据从不同的工作簿中获取到一个“主”工作簿中。手动按预期工作,但现在我想自动执行此过程。 我已经触及Range.FormulaArray属性的255个字符限制,并试图通过使用此处提供的技巧来规避它,但没有运气。 运行此代码时,公式的p1部分将插入范围,但不会执行2 .Replace。 我尝试了.Replace函数的“What”部分的不同变体,“X_X_X()”和“{0}”以及其他很多没有运气的部分。 Dim ws As Worksheet Set ws = ThisWorkbook.Worksheets(1) Dim p1, p2, p3 As String p1 = "=IF(G2<>"""",INDEX('C:\path\to\[document.xlsx]Sheet1'!$P:$P,MATCH(1,({0})*({1}),0)),"""")" p2 = "B2='C:\path\to\[document.xlsx]Sheet1'!$B:$B" p3 = "C2='C:\path\to\[document.xlsx]Sheet1'!$C:$C" With ws.Range("R2") .FormulaArray = "=IF(G2<>"""",INDEX('C:\path\to\[document.xlsx]Sheet1'!$P:$P,MATCH(1,({0})*({1}),0)),"""")" .Replace "{0}", p2 .Replace "{1}", p3 End With 我手动粘贴的公式是: =IF(G2<>"";INDEX('C:\path\to\[document.xlsx]Sheet1'!$P:$P;MATCH(1;(B2='C:\path\to\[document.xlsx]Sheet1'!$B:$B)*(C2='C:\path\to\[document.xlsx]Sheet1'!$C:$C);0));"")

3
从Excel 2013降级到Excel 2010时丢失VBA
我在Windows 7上。过去我使用的是Excel 2003.我安装了Office 2013,发现我的Office 2003完好无损,我可以运行这两个版本。我使用Excel 2013和VBA代码更新了一些工作表。 我被告知我需要使用Office 2010(我不会介绍原因)所以我卸载了Office 2013并安装了Office 2010(公司许可证)。当我打开2010年使用Excel 2013修改的电子表格时,我收到了Microsoft Visual Basic for Applications消息: 班级未注册。用CLSID寻找物体:(AC9F2F90-E877-11DE-9F68-00AA00574A4F) 当我点击Ok时,我收到Excel消息 Excel在name_of_spreadsheet .xls中找到了不可读的内容。您想恢复此工作簿的内容吗? 如果我选择YES,那么我会收到一条消息 Excel能够通过修复或删除不可读的内容来打开该文件。丢失Visual Basic项目。对数据透视表进行了修复,从工作簿和丢失的ActiveX控件中删除了一个或多个无效的条件格式。 现在找不到VBA代码。工作簿打开并看起来正常,但运行VBA的按钮不起作用,打开VBA(Alt+ F11)时,我看不到任何模块。 我尝试运行FM20.dll使用regsrv32.exe,我收到一条消息说: 模块fm20.dll无法加载。确保二进制文件存储在指定的路径中或调试它以检查二进制文件或从属.DLL文件的问题。指定的模块无法找到”。 但是我从FM20.dll所在的子目录中运行了regsrv32。 我认为我的问题与丢失Visual Basic项目和/或ActiveX控件有关。 在删除Excel 2013和安装Excel 2010之前,我需要做些什么才能找到那里的VBA代码?

3
将数据从列合并到行
我有一个电子表格: Company 1 | ID1 Company 1 | ID2 Company 1 | ID3 Company 2 | ID4 Company 2 | ID5 Company 2 | ID6 Company 3 | ID7 Company 3 | ID8 Company 3 | ID9 我需要将每个公司合并为一行,并将其所有ID合并到右侧的列中。每个公司可以有不同数量的ID。 最终结果将如下所示: Company 1 | ID1 | ID2 | ID3 Company 2 | …

3
使用没有自定义列表的Excel自定义排序
我希望能够对数据看起来像的excel行进行排序 Column - 1 Other Columns 701-GBL-1843-MLMK blah 566-JJB-2785-MYJW 254-WYD-3220-NAND 884-GLE-2843-FRYA 而且我希望能够通过第三个参数对数据进行排序,以便即时消息通过字符串中间的数字进行比较,从而最终像 701-GBL-1843-MLMK 566-JJB-2785-MYJW 884-GLE-2843-FRYA 254-WYD-3220-NAND 有没有办法做到这一点,而不是制作一个长度为100000000000000的自定义列表 基本上我想知道如何为Excel编写代码,在这里我可以进行自定义比较,就像 伪: mycompare(cell1, cell2): if(cell1's third param > cell2's third param): return GREATER if(cell1's third param < cell2's third param): return LESS return EQUAL sort(myWorksheet, mycompare) 不用说,我不知道如何编程或使用VB。抱歉。


2
在Excel中组合重复项,总结一些列并加权平均其他列
我有一个包含重复行的大型excel电子表格,我需要将重复项压缩成一行,其中一些列总和,其他列加权平均值。那可能吗?这是一个Google搜索字词列表,有些字词只显示十次其他条款,但在合并时保持数据准确非常重要。 A................B.......C..........D......E......F..........G.....H.....I.......J Term............Clicks..Impre...AvCTR...AvBid...Cost....AvPos..Conv.£Conv..CRate advent calendar 5572 147355 0.04 0.12 658.01 5.21 328 2.01 0.06 advent calendar 5719 084078 0.07 0.15 883.38 4.05 234 3.78 0.04 advent calendar 3398 070341 0.05 0.16 540.52 5.58 226 2.39 0.07 advent calendar 3078 108016 0.03 0.09 274.54 4.69 194 1.42 0.06 advent calendar 4948 …

1
Excel Mac VBA Loop Through Cells并重置一些值
我目前有12份工作簿 - 每个公司的位置都有一份。有多列,每月的每一天都有一行。位置管理器每天填写2列,其余列自动计算。如果当天没有金额,那么有一些“复杂”的用户拒绝在第二列中输入零,并且他们将其留空,导致整个工作表出错。 A列中每天总会有一个值,所以我想在用户单击“保存”时运行宏,这将检查A列的值。如果有一个值那么这意味着这一天已经过去,并且应该是D列中的值(即使它是零)。 总结一下,如果A列不是空白,请检查D列。如果是空白,请填入零。如果它不是空白,则用户输入一个值,然后我们可以继续。当它到达A列中的单元格为空时,只需退出整个过程。 我一直在浏览互联网几天试图解决这个问题,这是我到目前为止所做的: Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Dim curCell As Range 'Labor Flow Sheet'.Select For Each curCell in Range(A1:D31) If curCell.Value = "" Then <???????> End If Next curCell End Sub 我已经将范围设置为整个区域,但是我不知道如何知道循环只会检查A列。范围应该是(A1:A31)吗?那我怎么告诉它跳过同一行到D列检查那个值? 我真的很感激任何人的帮助。我希望能够在这个社区提供一些帮助,尽可能地回答其他问题! 再次感谢

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.