小编Mat*_*ttB的帖子

VBA将文件拖放到用户表单以获取文件名和路径

我想学习一个新的技巧,但我并不是100%自信在VBA中有可能,但我想我会在这里与大师核实.

我想要做的是避免使用古老的getopenfilename或浏览器窗口(在我们的网络驱动器上设置起始目录非常困难)并且我想创建一个用户可以拖动的VBA用户表单并从桌面或窗体上的浏览器窗口中删除文件,VBA将加载文件名和路径.同样,我不确定这是否可行,但如果是,或者如果有人在我欣赏指针之前已经完成了.我知道如何设置用户表单,但除此之外我没有任何真正的代码.如果有我能提供的东西,请告诉我.

感谢您的时间和考虑!

excel vba drag-and-drop userform

9
推荐指数
1
解决办法
2万
查看次数

VBA Internet Explorer等待加载网页

我知道之前曾经问过这样的问题,但我的情况有点不同,而且一直很麻烦.我正在处理的是一个带有表单的网页,当填写输入框中的某些项目时,这些表单会加载更多页面.当这些事件触发页面再次加载时,但保持在具有相同nameprop的相同URL.我一直在使用以下类型的方法单独和串联来处理等待页面加载,但有时VBA仍然设法继续执行并将HTMLDocument变量设置为页面,而没有相应的信息导致宏调试.以下是我到目前为止所尝试的各种事情:

While IE.Busy
    DoEvents
Wend

Do Until IE.statusText = "Done"
    DoEvents
Loop

Do Until IE.readyState = 4
    DoEvents
Loop
Run Code Online (Sandbox Code Playgroud)

我甚至试图将这些事件放入如下所示的循环中,但它并没有完全奏效,因为lastModified属性只返回一个值到第二个并且宏在字段中旋转足够快以至于它返回一个新的页面在同一秒:

Do Until IE.statusText = "Done" And IE.Busy = False And IE.ReadyState = 4 _
And IE.document.lastModified > LastModified ----or---- IE.document.nameprop = _
"some known and expected name prop here"
    While IE.Busy
        DoEvents
    Wend
    Do Until IE.statusText = "Done"
        DoEvents
    Loop
    Do Until IE.readyState = 4
        DoEvents
    Loop
Loop
Run Code Online (Sandbox Code Playgroud)

即使这样也无法等待足够长的时间来设置HTMLDocument对象导致调试.我已经考虑过设置下一个输入元素并检查无需进一步的代码,但即使这样也不会100%成功,因为通常输入元素存在于HTML中,但是在相应的事件被触发之前一直隐藏,这不会是一个问题,但他们不会加载他们可能的选择,直到事件被触发.这可能是一个奇怪的页面.

无论如何......不知道还有什么要补充.如果有其他事情可能有助于看到问.我想我正在寻找的方法是让VBA等到IE知道另一个页面不在它的路上.它似乎在完成之前加载了几次.

那么......任何人都有任何想法?

编辑:找到一些新的东西尝试.仍然没有骰子.有人建议我添加这些尝试.这是代码,由于某种原因,VBE和excel实例在触发应该填充select元素上的选项的事件后使用此方法时变得无响应...考虑尝试xml ...这里是代码:

intCounter = 0
Do until intCounter > …
Run Code Online (Sandbox Code Playgroud)

internet-explorer automation vba dom

7
推荐指数
1
解决办法
4万
查看次数

Outlook ReportItem.Body为某些用户返回乱码编码

我们最近有一个奇怪的问题,即影响一些用户的Outlook.

如果某些用户自动运行Outlook客户端以查看共享收件箱中的退回/ ReportItems,而不是返回文档所指示的消息的明文,我们会返回一个已被解析为UTF-8字符串的unicode字符串 - 所以它看起来像中国人.

现在我可以通过一些代码来解决这个问题,但另外一个问题是,这种变化发生在Outlook以及所有有权访问该收件箱的用户身上.在outlook中查看的消息本身显示为中文字符 - 原始unicode html解析为UTF-8.

看起来这可能是一个已知问题,但我想知道我是否可以在这里得到一些建议.

我们使用常规方法来访问报表项:

For Counter as Integer = Inbox.Items.Count To 1 Step -1
    Dim Report As Outlook.ReportItem = Inbox.Items(Counter)
    Dim Body As String = Report.Body
Run Code Online (Sandbox Code Playgroud)

最后一行是我们获取garbaled文本的地方.在VBA中,它尝试将其解析为ASCII并返回一个大块"?" 而在.Net中它返回解析为UTF-8的值,我们得到显示为中文的字符.在任何一种情况下,收件箱中的原始报表项都开始显示为中文字符,并继续为该收件箱的所有用户执行此操作.

有任何想法吗?

更新:我想分享一个更新,因为似乎有些人仍然看到它.

我想快速强调编码问题在这里很好地讨论,并且通过代码访问消息正文可以很容易. 但是,编码问题仍然存在于Outlook客户端中,并且从未解决过,这个问题是我一直关注的问题.必须在.Body属性中存在一些错误,这些错误会阻止Exchange服务器上原始邮件对象的编码.祝所有需要解决该特定问题的人好运.

再次更新:问题的答案和更详细的说明在下面发布并选择作为答案.

vb.net outlook encoding vba exchange-server

6
推荐指数
1
解决办法
2369
查看次数

在循环中键入Mismatch以扫描Outlook邮件

使用VBA循环访问Outlook收件箱时出现间歇性错误.Next objOutlookMes​​g行发生类型不匹配.

注意:我希望尽可能多,所以我包含了所有代码.滚动到底部以查看错误发生的位置.

Private Sub CheckInbox(strFolder As String, Title As String)

Dim objOutlook          As Outlook.Application
Dim objOutlookNS        As Outlook.Namespace
Dim objOutlookInbox     As Outlook.Folder
Dim objOutlookComp      As Outlook.Folder
Dim objOutlookMesg      As Outlook.MailItem
Dim Headers(1 To 20)    As String
Dim i                   As Integer

Headers(1) = "Division:"
Headers(2) = "Request:"
Headers(3) = "Exception Type:"
Headers(4) = "Owning Branch:"
Headers(5) = "CRM Opportunity#:"
Headers(6) = "Account Type:"
Headers(7) = "Created Date:"
Headers(8) = "Close Date:"
Headers(9) = "Created By:"
Headers(10) = "Account Number:"
Headers(11) …
Run Code Online (Sandbox Code Playgroud)

excel outlook vba

5
推荐指数
1
解决办法
4378
查看次数

使用HttpWebRequest.Create时的C#vs VB语法

我已经在VB中编写了很长一段时间,我也可以在C#和F#中做很多事情,但是VB和C#之间的一个语法差异继续让我失望.我是谷歌这个,但我不确定该怎么称呼它.请考虑以下示例:

在visual basic中我会这样做:

Dim Request As HttpWebRequest = HttpWebRequest.Create("www.google.com")
Run Code Online (Sandbox Code Playgroud)

但是,当我做出似乎是对C#的"逻辑"转换时:

HttpWebRequest Request = HttpWebRequest.Create("www.google.com");
Run Code Online (Sandbox Code Playgroud)

我得到隐式类型转换错误.看了一些其他代码后,我意识到这似乎是正确的方法:

HttpWebRequest Request = (HttpWebRequest)HttpWebRequest.Create("www.google.com");
Run Code Online (Sandbox Code Playgroud)

但是我不清楚在括号中另外提到HttpWebRequest类型的目的是什么.这是某种我不知道的演员语法吗?在这里发生了什么使得这项工作,而不是直接转换?

c# vb.net

5
推荐指数
1
解决办法
1447
查看次数

VBA MSXML2.ServerXMLHTTP 响应文本是一个 HTML 页面

我一直在环顾四周,但找不到任何方法来做我在这里想做的事情。甚至可能不可能,但我正在使用 MSXML2 驱动程序连接到网页。我得到的响应文本只是网页的 HTMl。不完全是我想要的,但我可能可以使用它。从那里,我想尝试将 HTML 文档对象设置为该响应文本,因为它只是一个 HTML 页面,但我遇到了类型不匹配的问题。我不确定这是否会让我更接近解决我的问题,但我认为值得在这里提问。这是我在做什么:

Sub GetResponseText()
    Dim Document as HTMLDocument
    Dim xmlHTTP As MSXML2.ServerXMLHTTP
    Set xmlHTTP = New MSXML2.ServerXMLHTTP
    xmlHTTP.Open "POST", "http://SomeServerName.dev/SomePage.Aspx", False, "User", "Password"
    xmlHTTP.send "Doesn't matter what I put here, response always the same"
    Set Document = xmlHTTP.responseText   <----- No dice.  Type mismatch here.
Run Code Online (Sandbox Code Playgroud)

所以,正如我所说,我什至不确定这是否会奏效。只是想我会登记。我正在尝试做的概述是这是一个内部应用程序,我正在尝试为我工作的公司填写。我在等待 AJAX 完成尝试直接自动化 HTML 的请求时运气不佳,所以我想知道这样的事情是否会有所帮助。有什么想法吗?

xml automation vba dom

3
推荐指数
1
解决办法
2万
查看次数

VBA隐藏用户表单但保留输入的数据

我又回来了,我希望这是一个相当容易的问题.

我正在尝试在VBA中创建用户表单.用户将在表单中输入某些信息,然后关闭表单.我希望用户表单保留用户关闭后输入的数据.我将它视为一个类模块,因为它本身就是技术,或者至少我理解它.这是我正在使用的代码:

在显示用户表单的主要子中:

Sub NonACATMemo()

Dim UserInput As MemoReasons
Set UserInput = New MemoReasons
UserInput.Show
Run Code Online (Sandbox Code Playgroud)

...然后在用户表单中关闭它...

Private Sub UserForm_Terminate()
MemoReasons.Hide
End Sub
Run Code Online (Sandbox Code Playgroud)

我也从表单上的命令按钮调用此子.我遇到的问题是,当我使用这种方法时,我得到一个错误"运行时错误'402':必须首先关闭或隐藏最顶层的模态形式." 如果我使用卸载我,当我尝试从表单中获取数据时,它被清除,我得到一个"服务器不可用"错误或类似的东西.

那么,关于隐藏用户表单但保留数据的任何想法?

最后几个笔记:这是项目中唯一的用户表单,这里是一个示例,说明我是如何使用Public Property Get方法从中获取数据的:

Debug.Print UserInput.EmailFlag
Debug.Print UserInput.ContraFirm
Debug.Print UserInput.MemoReason
Run Code Online (Sandbox Code Playgroud)

好吧,如果有人有任何建议,我会全力以赴.

user-controls automation vba class

2
推荐指数
2
解决办法
3万
查看次数

VBA 将数组缓慢写入 Excel 工作簿

只是想知道是否有人可以提供任何可能提高我的代码将数组写入工作簿的速度的建议。

我正在将大约 190 万行数据写入工作簿中的几张纸,一次一张。代码完成后,写入 excel 工作簿大约需要 18 个小时,这似乎过分了。这是设置。我这样打开工作簿:

Dim ExcelAp As Excel.Application
Dim ouputWorkbook As Excel.Workbook

Set ExcelAp = New Excel.Application
Set outputWorkbook = ExcelAp.Workbooks.Open("S:\Some Directory\Template.xlsx")
Run Code Online (Sandbox Code Playgroud)

然后我将数组中工作簿的行加载到集合中,并循环遍历工作簿中的范围以复制数组:

For lonSheetOneCounter = 2 to 999999
    outputWorkbook.Worksheets(1).Range(_
        outputWorkbook.Worksheets(1).Cells(lonSheetOneCounter, 1).Address & ":" & _
        outputWorkbook.Worksheets(1).Cells(lonSheetOneCounter, 21).Address).Value = _
        outputCollection.item(lonSheetOneCounter - 1)
Next lonSheetOneCounter
Run Code Online (Sandbox Code Playgroud)

其他纸张的复印方法相同。我已经使工作簿和 excel 实例不可见,我已将该工作簿的计算切换为手动,并且我还关闭了屏幕更新,但是完成复制到新工作簿仍然需要大约 18 个小时的时间。

我已经尝试为 entier 工作表制作一个二维数组,但是无论我使用哪种方法,当我尝试将该数组复制到工作簿时,都会出现“内存不足错误”。

我不确定是否还有什么我可以做的事情来解决错误并减少复制时间,但是如果有人有建议,我会全力以赴。就其价值而言,此宏位于另一个 excel 工作簿中,该工作簿在与我试图复制到的工作簿的单独 excel 实例中运行。

编辑:这里略有添加。我注意到我想引起注意的一些事情也让我认为有可能加快这个过程。我注意到宏逐渐变慢。前 X 行写入速度非常快,随着每一行的写入,接下来的行似乎越来越慢......

我将尝试一个实验,在该实验中,我设置模板以自动加载包含 100 万行已用行的电子表格……有点受底部建议的提示。我想知道 excel 是否必须为所有额外的行分配内存。也许如果我从一个已经设置了该行数的工作簿模板开始,我可能会更容易一些。

编辑:有人向我指出,我不清楚我正在阅读的数据来自哪里。使用 VBA 原语从多个文本文件中读取此数据。一个是管道分隔,另外两个逗号,并不是文件的方案有多大区别。

至于填充数组,这里是如何发生的片段。它看起来一团糟,但鉴于我正在比较的三个文件的格式,没有任何其他方法可以使数据匹配。无论如何,现在我将所有东西都放入大数组中,这就是我填充这些数组的方式。对 arrViLine 和 arrNonIraLine 和 arrIraLine 的引用只是文件的行从它们的原始管道和逗号分隔格式解析成的数组: …

arrays excel vba

2
推荐指数
1
解决办法
4362
查看次数