Tag: vba

复制行内容和格式(到另一个工作表)

我想要的是将整行的内容和格式复制到另一个工作表。 此刻,我不得不决定将旧的单元格内容设置为新的单元格内容,这样做只会复制内容而不是格式化。 (我的细胞有不同的颜色,需要传送) 目前,我有以下几点:(这对同一张纸上的细胞工作正常) Range(Cells(45, 2), Cells(45, 3)).Copy Range(Cells(50, 2), Cells(50, 3)) 但是,我试图从一张纸到另一张纸。 (从表'Front_Page'复制到'vg')。 我尝试使用以下,显然这是行不通的,但有人可以告诉我,我做错了什么? Range.Worksheet("Front_Page").Range(Cells(45, 2), Cells(45, 3)).Copy Worksheet("vg").Range(Cells(50, 2), Cells(50, 3))

SAP:SAPGUI分析GuiUserArea

问题! 目前在我工作的地方我们正尝试通过使用SAPGui , Excel和VBA自动执行某种重复任务。 通常情况下,我们从SAP的TCodes收集到的大部分报告都是用一个GuiUserArea来显示的,这个GuiUserArea不容易,整洁,快速地parsing。 解! 无论如何,我设法parsing这些types的报告取决于某些types的要求。 所以,我第一次试图parsing任何报告(显示为GuiUserArea),我想出了这样的想法:将报告保存为未格式化的文本很容易,然后使用VBA(正则expression式,分裂,文本长度,…),而不是使用GuiUserArea方法和属性。 请注意,使用这个过程(保存文件)更容易和快速地parsing信息,但是使用SAPGUI对象只是为了保存文件而不是parsing信息来完成更复杂的任务。 使用GuiUserArea我已经想出了以下解决scheme: Sub ParseSAPGUI() Dim objSAPGui As Object Dim objApplication As Object Dim objConnection As Object Dim objSession As Object If (objSAPGui Is Nothing) Then Set objSAPGui = GetSAPGuiObject() Set objApplication = GetSAPGuiScriptEngine(objSAPGui) End If If (objConnection Is Nothing) Then Set objConnection = GetSAPGuiConnection(objApplication) End If If […]

使用在C ++中创build的DLL从Excel和VBA调用C ++函数

我创build了一个包含名为“koduj”的函数的DLL。 通过在Excel工作表单元格中使用此函数来调用该函数将返回所需的结果。 从VBA调用“koduj”会返回错误的答案。 koduj需要两个参数: string nr_id和integer x1 。 它用ASCII表示法计算nr_id字母的总和,并加上x1 。 计算的总和比返回。 我正在按照这里find的指示。 这是我的.cpp源文件: #include<Windows.h> #include<string> using namespace std; //Convert BSTR to wstring for convenience wstring BSTR_to_wstring (BSTR text){ return wstring(text, SysStringLen(text)); } //Calculate sum of letters in ASCII representation int ASCII_sum (wstring ws){ int sum = 0; for (unsigned int i = 0; i < […]

Excel工作簿连接使文件大小变大

我有一系列约30个Excel报告( .xlsm ),每个报告都有一个configuration到数据库的唯一连接。 该连接只是一个简短的SQL脚本,用于抓取报表中显示的数据。 数据被填充到一个表(而不是数据透视表)。 每周我们都需要更新这些报告,所以我使用一个简单的PowerShell脚本打开每个文件并刷新连接。 每隔一段时间,我们都需要向其他工作组发送基本报告,以便他们可以自行手动更新文件。 这可能是一个麻烦,因为一些报告非常大(30mb +)。 这使得发送电子邮件变得困难,并且一天几次上传/下载它们只是一个麻烦。 为了减轻这一点,在我们分发报告模板之前,我尝试删除表中的所有行以及任何未使用的范围。 这有所帮助,但是仍然有几个文件非常大(30mb +),即使我们删除了工作簿中除连接和空表以外的所有内容。 通过testing,我意识到,如果我删除configuration的连接,文件大小变得足够小(<1mb),这是我所期望的。 这使我相信,Excel连接有一种caching需要清除,但我找不到任何参考。 有谁知道一个简单的方法来减less连接的大小,我可以这样做,以编程方式使用VBA / Powershell?

ThisWorkbook.ChangeFileAccess xlReadWrite在VBA窗口中为工作簿创build多个VBAProject

我的工作簿有以下公开事件: Private Sub Workbook_Open() ThisWorkbook.ChangeFileAccess xlReadOnly End Sub 然后这个button: Sub UnlockDeveloper() Dim pwd As String pwd = InputBox("Enter developer password:", "Password") If pwd = "password" Then If ThisWorkbook.ReadOnly = True Then ThisWorkbook.ChangeFileAccess xlReadWrite End If Else MsgBox ("Incorrect password.") End If End Sub 这一切都工作正常,但通常,但有时运行UnlockDeveloper子导致VBAProject在VBA窗口中出现两次,我无法知道哪个是真正的文件。 如果我改变了错误,那么一旦closuresExcel,更改就会丢失。 任何人有任何想法如何防止这一点?

在条件格式中使用UDF时,VBA编译器不会中断/陷印错误,也不会出现错误消息

看到新的发展。 我在Excel中有一个奇怪的问题。 我有一个Worksheet_Change事件,我正在使用,我试图debugging它。 我保存程序并将其打开,编译器突然间没有出现错误。 事实上,这根本不算什么! 我会在小组的头部rest一下(接下来的三条线是很好的措施),但这并没有发生。 我想也许事件没有启用…所以,我已经把一个消息框作为代码的第一行之一。 消息框popup….甚至在线上的rest。 这发生在另一个macros的特定行之前,我曾尝试将所有内容复制到一个.txt文件,并粘贴到我的程序的早期版本。 这工作了好几个月,但问题现在又回来了。 编码不是很重要,但我会粘贴下面的踢和咯咯。 这是中止没有错误,我删除了所有的“错误”的或不。 我已经将代码剪切并粘贴到一个新的子文件中,并且工作正常。 我也检查了选项,并选中“打破所有错误”。 什么也没有,即使一个未定义的调用不会抛出一个错误,将停止程序中止。 Private Sub Worksheet_Change(ByVal target As Range) Application.EnableEvents = False Dim aVar() As String Dim iVar As Integer On Error GoTo 0 MsgBox "you changed something" 'this is a msgbox that does pop up during execution, verifying that the sub did […]

强制VBA使用英国本地化

我用我创build的电子表格碰到了一个问题。 它在我的个人电脑上工作正常,但我知道在办公室的其他个人电脑有美国本地化。 有没有办法强制VBA检查使用英国本地化的东西? 我遇到的问题是,作为macros的一部分,我使用“文本到列”来确保input的date显示为date,而不是数字或文本。 在我的电脑上,它似乎工作正常,但我知道我把它设置为英国本地化。 其他人有问题,不知道是否是英国本地化。 而不是在检查其他人的本地化或者坚持说他们在他们的计算机上有英国本地化,这是理想的,如果我可以在VBA中join一行额外的代码来强制在这个macros中完成的任何事情都可以在英国本地化。 问题本身就是该计划将英国格式的date转换为美国格式。 当文本到列的阶段发生在macros中时,似乎就发生了。 有没有办法让VBA自动检查是否是英国的本地化,如果不是,那就把它改成英国的本地化,最后把它改回来? 我不想强制每台电脑都有英国本地化,因为它可能会导致其他问题或惹恼用户 – 这绝对是不可取的! 干杯!

使用Excel中的VBA打开Outlook Mail .msg文件

我试图打开使用VBA指定的目录.msg文件,但我不断收到一个运行时错误。 代码我有: Sub bla() Dim objOL As Object Dim Msg As Object Set objOL = CreateObject("Outlook.Application") inPath = "C:\Users\SiliconPlus\Desktop\Si+ Contact Lists\Contact_Si+" thisFile = Dir(inPath & "\*.msg") Set Msg = objOL.CreateItemFromTemplate(thisFile) ' now use msg to get at the email parts MsgBox Msg.Subject Set objOL = Nothing Set Msg = Nothing End Sub 这是运行时错误: 运行时错误“-2147287038(80030002)”: 无法打开文件:AUTO […]

Redim可变数量的维度在VBA中

我有一个Excelmacros(VBA)的情况下,我想维数组维数和维度的边界在运行时确定。 我让用户通过为每个选项types创build一个列并填写下面的可能性来指定一系列组合选项。 运行时通过检查纸张来确定列数和选项数量。 一些代码需要运行每个组合(从每列中select一个),我想将结果存储在一个multidimensional array中。 维度的数量可能在2到6之间,所以如果必须的话,我总是可以回到一堆其他的块中,但是感觉应该有一个更好的方法。 我在想,如果我可以在运行时将Redim语句构build为string并执行string,那么可以这样做,但这似乎不可能。 有没有办法dynamic地用不同数量的维度来进行Redim处理?

在parsingOutlook收件人时select多个条目的第一个条目

我有一个函数,它取得一个名称并在Outlook中parsing它,以返回所选名称的别名。 当地址簿中的选定名称有多个条目时,这将失败。 例如“Smith,Bob”和“Smith,Bob X”。 如果我试图解决的名字是“史密斯,鲍勃X”,代码工作正常,但普通的“史密斯,鲍勃”失败。 我认为当find多个条目时,Outlook会打开“检查名称”对话框(当我手动parsing名称时会发生这种情况)。 当我的代码find多个条目时,如何select第一个条目? Function GETTPX(ByVal UserName As String) As String Dim objOL As Object Dim oRecip As Outlook.Recipient Dim oEU As Outlook.ExchangeUser Dim oEDL As Outlook.ExchangeDistributionList Set objOL = CreateObject("Outlook.Application") Set oRecip = objOL.Session.CreateRecipient(UserName) oRecip.Resolve If oRecip.Resolved Then Set oEU = oRecip.AddressEntry.GetExchangeUser End If GETTPX = oEU.Alias Set oRecip = Nothing […]