我有一个Excel工作簿,它向数据库发出三个查询以填充隐藏工作表上的三个表,然后运行三个"刷新"脚本将这些数据拉到三个可见的演示文稿表(每个查询一个).同步运行它非常慢:刷新的总时间是三个查询中每个查询的时间总和加上每个"刷新"脚本运行的时间总和.
我知道VBA不是多线程的,但我认为可以通过异步触发查询来加快速度(从而允许在执行时完成一些清理工作),并且然后在数据返回时为每个工作表执行填充/刷新工作.
我重写了我的脚本如下(请注意,我必须删除连接字符串,查询字符串等,并使变量通用):
Private WithEvents cnA As ADODB.Connection
Private WithEvents cnB As ADODB.Connection
Private WithEvents cnC As ADODB.Connection
Private Sub StartingPoint()
'For brevity, only listing set-up of cnA here. You can assume identical
'set-up for cnB and cnC
Set cnA = New ADODB.Connection
Dim connectionString As String: connectionString = "<my conn string>"
cnA.connectionString = connectionString
Debug.Print "Firing cnA query: " & Now
cnA.Open
cnA.Execute "<select query>", adAsyncExecute 'takes roughly 5 seconds to execute
Debug.Print "Firing cnB query: " & Now …Run Code Online (Sandbox Code Playgroud) 我每次create table触摸项目中的任何文件时,Visual Studio中的数据库项目最近都会开始抛出这些未解决的引用错误.
SQL71501: Column: ___ has an unresolved reference to Built-in Type [int].
SQL71501: Column: ___ has an unresolved reference to Built-in Type [datetime].
SQL71501: Column: ___ has an unresolved reference to Built-in Type [varchar].
Run Code Online (Sandbox Code Playgroud)
如果我重建项目,一切都没有错误,并且Visual Studio标记的错误消失了.但是,只要我编辑任何文件(即使只是在文件末尾添加一个空格),该文件将立即被这些未解决的引用错误所困扰...... 直到我再次重建.但是,由于这是一个相当大的项目,我不希望在每次轻微编辑后花费大约一分钟重建.
该项目由其他几个没有遇到此问题的人开展.我该如何解决这个问题?
更新:如果我更改选项卡,第一个选项卡的错误将消失,直到我返回它.我也禁用了所有扩展,但问题仍然存在.
尽管场景奇怪,但这不是一个功课问题.我刚刚替换了我正在使用的真实对象来简化示例.
这让我从这里开始,但不确定如何继续.我试图写一个包含集合类,而我在世界迷路IEnumerator和IEnumerable,这是我很新的(甚至没有完全肯定我是在正确的道路上).假设我有一节课:
Public Class BakedBean
Private Shape As String
Private Variety As String
Private Flavour As String
'etc
End Class
Run Code Online (Sandbox Code Playgroud)
另一个代表BakedBeans 集合的类:
Public Class TinOfBeans
'?
End Class
Run Code Online (Sandbox Code Playgroud)
我希望能够作为一个集合Beans进入TinOfBeans类中,这样我就可以进行这样的调用,但不依赖于特定的集合类型:
Dim myTin As New TinOfBeans()
myTin.Add(New BakedBean(...))
For Each bean As BakedBean in myTin
'...
Next
myTin(0).Flavour = "beany"
Run Code Online (Sandbox Code Playgroud)
我一直在寻找IEnumerable和IEnumerator,我有这么多,到目前为止,但我越来越很失去了它:
BakedBean类
Public Class BakedBean
Private Shape As String
Private Variety As String
Private Flavour …Run Code Online (Sandbox Code Playgroud) 我最近试图Nz(Value, [ValueIfNull])在Excel中重新定义Access的功能,因为我发现它非常有用但它在Excel中不存在(因为我发现在移动一些有用的函数时我很失望).Access的Nz函数检查Value- 如果此值为null,则返回ValueIfNull(否则返回Value).在Access中,它对于检查输入框的值(以及其他几个方面)非常有用:
If Nz(myTextBox.Value, "") = "" Then
MsgBox "You need to enter something!"
End If
Run Code Online (Sandbox Code Playgroud)
滚动我自己的Nz功能似乎并不困难:
Public Function Nz(value As Variant, Optional valueIfNull As Variant = "") As Variant
If IsNull(value) Then
Nz = valueIfNull
Else
Nz = value
End If
End Function
Run Code Online (Sandbox Code Playgroud)
但是一旦我尝试用任何实际上为空的东西调用它,Excel就会在调用行上抱怨它(Run-time error '91': Object variable or With block not set我理解它与NullReferenceException其他语言大致相同),甚至在进入Nz函数体之前.例如,Nz(someObj.Value, "")只有在someObj.Value不为null 时才会起作用(使函数完全没有用).
我在这里错过了VBA的一些细节吗?来自VB.NET之类的语言,看起来很混乱 - 我理解对象引用只是驻留在内存中的实际对象的地址,因此传递引用(而不是对象)不应该导致问题(直到你尝试实际上,当然对不存在的对象做一些事情.例如:
Dim myObj …Run Code Online (Sandbox Code Playgroud) 我在Access表单上有一个两列组合框,表示键到代码映射.组合框的第一列是"绑定列"(即MyComboBox.Value调用时使用的列).
我需要Value根据第二列中的值动态设置我的组合框.例如,如果我的组合框源是:
Value | Code
===============
A1 | ABCD
A2 | EFGH
A3 | IJKL
Run Code Online (Sandbox Code Playgroud)
我可以简单地设置组合框的值ComboBox.Value = "A2",但是如何使用第二列进行相同的操作?ComboBox.Value = "EFGH"显然是无效的.基本上寻找逻辑沿线ComboBox.Value = ComboBox.ValueWhereSecondColumnEquals("EFGH")
我在上面有3个字段的访问报告:Width,Height和Area.
Width并且Height从报告所绑定的表中拉出,同时Area应计算(高度*宽度).我已经设定Control Source的Area到= [Height] * [Width],但在打开表单中的字段显示#Type!,在一般描述性的访问错误的方式,与漂亮的利用#,并!使其无法准确谷歌......但我离题.我不知道是什么#Type!意思,Access不想告诉我.
我无法理解这一点.在绑定表中,Height并且Width是整数,并且都被填充在正在查看的记录中(因此这不是NULL问题).如果我改变了Control Source一些非常简单的东西- 比如=[Height],它会吐出#Error!来(再次,感谢有用的英特尔,Access.如果没有你,我们就会迷失方向).甚至= 1吐出来#Error!.
知道为什么Access讨厌我的控件来源吗?
VBA中的静态变量非常简单:
Public Sub foo()
Static i As Integer
i = i + 1
Debug.Print i
End Sub
Run Code Online (Sandbox Code Playgroud)
输出(多次调用时):
1
2
3
...
Run Code Online (Sandbox Code Playgroud)
问题是,VBA不支持在与声明相同的行上初始化变量(不计算:在一行上放两行):
Public Sub foo()
Dim i As Integer = 5 'won't compile!
Dim j As Integer
j = 5 'we have to do this instead
End Sub
Run Code Online (Sandbox Code Playgroud)
这与静态变量冲突:
Public Sub foo()
Static i As Integer 'we can't put an initial value here...
i = 5 'so this is how we'd usually initialize it, but...
i = …Run Code Online (Sandbox Code Playgroud) 我正在尝试动态刷新 Excel 中的一些数据透视表。数据透视表(和连接的切片器 - 每个切片器连接到多个数据透视表)已经存在,基础源数据表不存在。流程如下:
澄清结构: 一张数据源表。多个数据透视表指向源。多个切片器,每个切片器连接到所有数据透视表(例如,周结束切片器更改所有数据透视上的周结束)
然而,我在步骤 4 中遇到了问题。以下代码有效:
'dataTable is a ListObject that was created on a sheet earlier in the function. Can confirm 100% that it exists and is populated.
Dim pt As PivotTable
For Each pt in PivotSheet.PivotTables
pt.ChangePivotCache ThisWorkbook.PivotCaches.Create( _
SourceType:=xlDatabase, _
SourceData:=dataTable)
Next pt
Run Code Online (Sandbox Code Playgroud)
然而,这意味着每个数据透视表有一个数据透视缓存,这意味着我在尝试设置操作多个数据透视表的切片器时遇到问题 - 它假设每个数据透视表都有不同的数据源,因此只会让我将切片器链接到单个枢轴。
我决定采取的方法是创建一个单一的数据透视缓存,然后将每个数据透视表链接到它。然而,这段代码不起作用,error 5在第一次到达时向我抛出:
'dataTable is a ListObject that was created on a sheet earlier in the function. …Run Code Online (Sandbox Code Playgroud) 我正在针对新的(呃)Sql Server 2008 环境重写一堆旧的、写得不好的 Oracle 查询。他们使用老式的 Oracle 连接语法,例如
select <whatever>
from Table1, Table2, Table3
where Table1.T1ID = Table2.T2ID -- old Oracle inner join
and Table2.T3ID = Table3.T3ID (+) -- old Oracle left join (I think)
Run Code Online (Sandbox Code Playgroud)
除了复杂得多。在这些事情中存在大量的混合连接、大量的嵌套以及大量的视图堆积在视图上。这并不漂亮。两台服务器之间的数据也不同,这使得测试变得很麻烦。
我认为最简单的复制方法是使查询在 Sql Server 中看起来尽可能相似(即使用相同样式的联接),然后在我确信它们是之后执行大量清理工作两者肯定都在做同样的事情,而且我没有在错误的地方加入(是的,我暂时设置了兼容模式来支持旧的加入)。
我知道 T-Sql 中内部联接的“旧”语法是
select <whatever>
from T1, T2
where T1.ID = T2.ID
Run Code Online (Sandbox Code Playgroud)
但是左外连接或右外连接的“旧”语法是什么?
考虑以下代码:
<div id="sidebar">
<?php
require_once('/components/search.php');
require_once('/components/categories.php');
?>
</div>
Run Code Online (Sandbox Code Playgroud)
search.php本质category.php上是相同的结构 - 具有一些特定内容的 div 容器。这里没什么特别的,纯 HTML:
<div class="component">
<!-- blah -->
</div>
Run Code Online (Sandbox Code Playgroud)
然而,当用require_once(或require/include等) 插入时,PHP 在每个元素上方添加空格,将其向下推,可在 Chrome 的 Inspect Element 工具中识别为空文本节点(删除此节点时空格消失)
从侧边栏脚本中删除所有不必要的空格(使其成为单行代码)并不能解决问题。如果我只是用require_once组件的内容替换这些行,则不会出现空格。所以不确定为什么 PHP 在 require 上添加它。有任何想法吗?
更新
事实证明,这个仍然是一个奇怪的。我现在同意这require_once似乎不是根本原因。我决定暂时忽略这个问题,并希望在我进一步解决它之后它会消失。唉,它仍然存在,所以我做了更多调查。检查浏览器中的页面源代码,确认有问题的代码确实作为一个长的不间断行返回http://pastebin.com/dtp7QNbs - 任何标签之间没有空格或回车符,但浏览器中出现空格- 在检查元素工具中可识别为每个元素之间的空行<div class="component">
这是否有助于进一步阐明这个问题?
vba ×5
excel ×3
excel-2010 ×2
excel-vba ×2
ms-access ×2
access-vba ×1
adodb ×1
collections ×1
join ×1
legacy-code ×1
php ×1
require-once ×1
sql-server ×1
static ×1
vb.net ×1
vb6 ×1
whitespace ×1