我已经创build了一个包含大量工作表的Excel 2010工作簿。 执行各种数据操作的VBA代码是在几个模块中,并附加到几个表单。 该工作簿正在分发给不同部门的几十个人使用。 他们将使用他们自己的部门特定数据来填充他们的工作簿。 如果我需要分发代码的更新(错误修复或一些新function),那怎么做? 我不希望用户必须重新input或复制/粘贴他们所有的数据到“新”工作簿 – 我本质上是寻找一种方法来更新现有的工作簿内的VBA项目。
编辑:发现新的错误? 我可能刚刚发现为什么我的脚本不能工作了。 最近有一个办公室更新,似乎他们已经实施了微软查询,摆脱了我安装和configuration我的需要的ODBC-Manager。 现在实际的问题可能是这个微软查询没有UNICODE库,我不知道我可以把它们放在哪里,以便微软的查询会读取/获取它们。 或者说,我不知道如何给微软查询的UNICODE库的path,因为在经理有没有可能改变它,也许有,我只是没有find它? 除此之外,我不能打开微软查询pipe理器,除非我直接从Excel工作簿中打开它。 原文问题 这段代码工作了一段时间。 现在使用完全相同的代码,我得到一个运行时错误。 在这里,我已经要求在这种情况下的帮助,并得到它的工作。 代码如下: Sub ConnectSQL() Dim connstring As String Dim sLogin As String Dim qt As QueryTable sLogin = "Uid=*;Pwd=*;" sqlstringFirma = "select * from gi_kunden.tbl_Firma" sqlstringPerson = "select * from gi_kunden.tbl_Person" connstring = "ODBC;DSN=KundeDB;" & sLogin ActiveWorkbook.Sheets("Firma").Select ActiveSheet.Range("A1:T2000").Clear For Each qt In ActiveSheet.QueryTables qt.Delete Next qt […]
我还有一个问题,我希望能在你的帮助下解决。 我想做什么 我使用Excel来跟踪我的工作,活动,联系人等等。 虽然这样做,我发现我做了很多重复的工作,在名为“活动”的工作表的末尾添加行。 我想要做的是这样的: – 按下一个button,并添加一行。 – 使用1增加跟踪编号 – 插入默认值 代码。 为了实现这一点,我发现(复制,粘贴,调整到我的需要)下面的代码: Sub AddRowActiviteiten_NewAtEnd() 'Add's a new row at the end of the sheet. Dim wsActiviteiten As Worksheet Set wsActiviteiten = Sheets("Activiteiten") DefType = "Daily" DefStatus = "Open" DefIssue = "*****" DefImpact = "*****" DefPrio = "Laag" MyDate = Date wsActiviteiten.Range("A4").Value = "1" 'Copy […]
我有一个MonthView的UserForm,当我单击指定的单元格区域时,它会成功打开, 这个SO线程给了我基本的脚本。 它的function,但它似乎并没有把我所期望的UserForm。 这里是当前脚本(我已经放在一个特定的工作表中)来打开用户窗体,当我点击区域B3:C2000任何单元格时B3:C2000 : Private Sub Worksheet_SelectionChange(ByVal Target As Range) Set oRange = Range("B3:C2000") If Not Intersect(Target, oRange) Is Nothing Then frmCalendar.Show frmCalendar.Top = ActiveCell.Offset(0, 0).Top frmCalendar.Left = ActiveCell.Offset(0, 1).Left End If End Sub 问题1:我有UserForm StartUpPosition属性设置为0 – Manual – 是否正确? 问题2:当我单击指定范围内的任何单元格时,第一次打开工作簿后,UserForm总是在屏幕的最左上angular打开。 为什么? 问题3:当我单击指定范围内的任何单元格时,对于第一个单元格之后的任何单击,用户窗体相对于前一个活动单元格而不是我刚刚单击的单元格打开。 我怎样才能打开它相对于刚刚点击的单元格,而不是相对于以前的活动单元格? 问题4:为什么看起来alignmentUserForm的底部而不是顶部? 在我执行以下步骤之后: 1 – 点击单元格C15 2 – 用户窗体打开 3 – […]
我有一个工作表上的ActiveX组合_Change控件,这是_Change事件代码 Private Sub ComboBox1_Change() Me.ComboBox1.ListFillRange = "ItemSearch" Me.ComboBox1.DropDown End Sub 当我使用键盘上/下键移动列表时,它会自动退出Excel。 有谁知道这个问题的解决scheme? 我基本上想要一个dynamic的combobox。
有没有人知道最快的方式从SQL 2008中获取数据和Excel表(VBA数组)到一个表, 而不使用外部工具(即BCP)? 请记住我的数据集通常是6500-15000行,大约150-250列; 最终我在一个自动化的VBA批处理脚本中传输了大约20-150个。 我已经尝试了从Excel表格(VBA)中获取大量数据到SQL 2008的几种方法。我已经列出了以下内容: 方法1.将表传递到VBA数组并发送到存储过程(ADO) – 发送到SQL是SLOW 方法2.创build断开的RecordSet加载它,然后同步。 – 发送到SQL非常慢 方法3.将表放入VBA数组,循环数组并循环(使用分隔符),然后发送到存储过程。 – 发送到SQL SLOW,但比方法1或2快。 方法4.将表放到VBA数组中,循环数组并循环(使用分隔符),然后用ADOlogging集.addnew命令放置每一行。 – 发送到SQL非常快(比方法1-3快大约20倍),但是现在我需要使用单独的过程来拆分这些数据,这将增加显着的等待时间。 方法5.将表放在VBA数组中,序列化成XML,作为VARCHAR发送到存储过程,并在存储过程中指定XML。 – 发送到SQL INCREDIBLY SLOW(比方法1或2慢大约100倍) 我错过了什么?
我正在尝试做什么 我试图写一个函数来减去Excel范围 。 它应该有两个input参数:范围A和范围B.它应该返回范围对象,它是属于范围A的一部分的单元格,不属于范围B的一部分(如在设置减法中 ) 我试过了 我在网上看到了一些使用临时工作表来做这件事的例子(很快,但是可能会引入一些受保护的工作簿等问题) ,还有一些其他的例子,通过第一个范围检查与第二个一个(非常慢) 。 经过一番思考,我已经提出了这个代码{1} ,它运行得更快,但仍然很慢。 从代表整个工作表的范围中减去1到5分钟取决于第二范围的复杂程度。 当我查看那些试图加快速度的代码时,我发现应用分治策略的可能性是我所做的{2} 。 但是这使我的代码变慢了。 我不是一个CS的家伙,所以我可能做错了什么,或者这个algorithm根本就不是分治应该使用的那个,我不知道。 我也尝试使用大多数recursion重写它,但是这花了很长时间来完成或(更经常地)抛出堆栈空间错误。 我没有保存代码。 我已经能够做的唯一(略微)成功的改进是添加一个翻转开关{3} ,首先通过行,然后(在下一个调用中)通过列,而不是通过两个在同一个调用,但效果没有我所希望的那么好。 现在我看到,即使在第一次调用中没有经过所有行,但在第二次调用中,我们仍然会循环执行与第一次调用相同数量的行,但只有这些行稍微短一点:) 我将不胜感激任何帮助改善或重写这个function,谢谢! 该解决scheme基于Dick Kusleika接受的答案 迪克Kusleika ,非常感谢您提供您的答案! 我想我会用它做一些修改: 摆脱了全局variables(mrBuild) 修正了“一些重叠”的情况,排除了“不重叠”的情况 增加了更复杂的条件来select是从上到下还是从左到右分割范围 通过这些修改,代码在大多数常见情况下运行速度非常快。 正如已经指出的那样,我同意的棋盘式的巨大的范围仍然是缓慢的,是不可避免的。 我认为这个代码还有一个改进的余地,我会更新这个post,以防我修改它。 改进可能性: select如何分割范围的启发式(按列或按行) {0}解决scheme代码 Public Function SubtractRanges(rFirst As Range, rSecond As Range) As Range ' ' Returns a range of cells that are […]
我需要安全地将Excel文件中的数据透视表的caching转换为不同文件的数据透视表。 我怎样才能做到这一点? 这是我现在使用的代码(请注意,即使源数据源已被删除,该方法仍然有效): Public Sub TransferPivotCache(Source As PivotTable, Target As PivotTable) Dim TempSheet As Worksheet Set TempSheet = ThisWorkbook.Sheets.Add Source.TableRange2.Copy Destination:=TempSheet.Range("A1") Target.CacheIndex = TempSheet.PivotTables(1).CacheIndex TempSheet.Delete End Sub 然而,当我导入的关键是太大,我修改caching索引属性时,得到错误“没有足够的内存”。 然后,即使文件closures,如果我试图重新打开它,它已经损坏。 是否有更好的方法来在数据透视表之间传输透视caching?
我有一个Excel工作簿包含一些ComboBox控件直接放置在工作表上。 这些是“表单”工具栏中的标准combobox。 当用户使用“另存为”保存具有不同名称的工作簿时,会触发所有combobox上的更改事件,包括未激活的工作表上的更改事件。 由于select并没有真正改变,这似乎是不合理的。 由于事件处理程序中的代码,这会导致各种不良行为。 事件不会在简单的“保存”中触发。 谷歌build议这是Excel中的一个已知问题。 有传言说,这是由于使用命名范围作为ListFillRangecombobox,我已经做了,虽然它不是一个易变的名字。 我正在寻找一种方法来防止这种情况发生,只需对代码和电子表格进行微小的更改。 有没有人有一个成熟的解决scheme
在使用VBA编写在excel中使用的自定义函数时,如何编写文档注释以便在自动填充公式时自动显示excel? 例如,当我们开始键入VLookUp时,它显示了Vlookup作为一个工具提示,显示inputvariables的名称,如果我们从function区中按插入function,一个对话框显示清晰的function说明…我们如何在VBA中编写自定义函数的同时实现?