我已经把一个简单的Excel数据库放在一起,执行一些macrosfunction,我需要将这个数据库分发给几个人 – 但是他们不能看到macrosfunction是如何工作的(愚蠢的规则我必须遵循!)。 达到这个目标的最好方法是什么? 我做了一些研究,发现了两种方法: 密码保护VBA项目 ; 但是显然这很容易在网上使用现成的工具来打破(这对我发送这个macros的人来说是最有利的,所以我几乎100%肯定他们会尝试进入它..因此密码保护似乎不足够。 转移到一个完全编译的语言,如C ++ ; 我的技能是非常有限的Excel和Access VBA,所以这是理想的解决scheme; 是不是我的解决scheme:( 还有其他的方法吗? 我想有一个“主Excel文件”的所有macros,然后发送“儿童”数据库的最终用户,并有“儿童”数据库连接到“主” – 是这样的可能吗? 通过托pipe网上的主人,甚至发送最终用户的主人,但使其完全无法访问,除非由“儿童”数据库访问?
我用我的普通域凭据login到了我的工作站。 我们称之为AccountA。 然后我使用“以其他用户身份运行”来启动Excel。 我们称之为AccountB。 我这样做是因为需要查询一些SQL服务器的权限必须使用AccountB完成。 此时,我需要包含一个子例程来启动一个Shell来创build目录并在远程服务器上移动文件。 AccountB没有(也没有)权限来执行此操作。 我的shell给我一个拒绝访问的消息。 精细。 所以现在,我需要让VBA返回AccountA的名字,这是我用来login到计算机的帐户。 我该怎么做呢? 我在这个网站上看到了很多例子,以及其他会返回运行Excel(AccountB)的用户名的例子。 但是,我还没有看到任何示例将通过RunAs将AccountA信息传递到Shell以使用适当的权限执行我的命令。 下面是我尝试过的一些事情,都返回AccountB(通过RunAs帐户使用启动Excel) 这个应用程序将被多个有权限的用户在远程服务器上运行cmd shell使用,所以AccountA不能被硬编码,并且必须以编程方式获得。 ' Access the GetUserNameA function in advapi32.dll and ' call the function GetUserName. Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" _ (ByVal lpBuffer As String, nSize As Long) As Long Sub XXXXXXXXXX() '// ThisWorkbook.Sheets("XXXXXXXXXX").Activate ' select the worksheet for […]
我有两个包含图表的工作表,并使用macros来运行所有工作表中的图表,并更新绘制的值。 不过,当我试图在第一个图表中引用图表时遇到了一个问题 – 虽然工作表的引用发生了变化,但对图表的引用却没有。 循环如下所示: For Each ws In ThisWorkbook.Worksheets Debug.Print ws.Name Debug.Print ws.ChartObjects("Kortsone").Chart.Name With ws.ChartObjects("Kortsone").Chart … End With Next ws 我得到的直接窗口的输出如下: Grafar ovn 3 Grafar ovn 3 Kortsone Grafar ovn 4 Grafar ovn 3 Kortsone 您可以看到对工作表的引用更改,但图表引用没有。 有没有办法解决这个问题,或者我将不得不重新命名我的所有图表的独特名称? 我正在使用Excel 2013 – 编辑 –我现在已经根据评论中的build议做了一些testing,看起来打印到即时窗口的内容取决于当前活动工作表的内容。 试图for each chartobject遇到了与我以前相同的问题: Sub test2() Dim ws As Worksheet Dim ch As […]
我怎样才能停止resize的button? 每次点击button时,button的大小或字体大小都会改变。 注意:我无法locking我的工作表,因为我的macros将写入工作表。 Autosize被closures。 我在Windows 7(64位)上运行Excel 2007。
我的excel文件包含很多公式,因此我希望它打开后立即将计算模式设置为手动。 否则计算自动开始,我不得不等待几个小时。 我发现这个网页: http://excel.tips.net/T001988_Forcing_Manual_Calculation_For_a_Workbook.html 这应该能够做到这一点。 但是它不适用于我的excel文件。 它指出,在VBA代码中,在“ThisWorkbook”部分,应该input以下代码: Private Sub Workbook_Open() Application.Calculation = xlManual Application.CalculateBeforeSave = False End Sub 正如所指出的那样,在我的情况下它不起作用。 有人有另一种解决scheme吗? 提前致谢!
我正在清理一些现有的代码 Sheets("Control").Select MyDir = Cells(2, 1) CopySheet = Cells(6, 2) MyFileName = Dir(MyDir & "wp*.xls") ' when the loop breaks, we know that any subsequent call to Dir implies ' that the file need to be added to the list While MyFileName <> LastFileName MyFileName = Dir Wend MyFileName = Dir While MyFileName <> "" […]
那么不是真的RANDBETWEEN() 。 我试图创build一个UDF来返回一个数组中的数字的索引,其中数字越大,被选中的可能性就越大。 我知道如何将概率分配给工作表中的随机数(例如,在概率总和上使用MATCH() ,所以在这里解释了很多东西),但是我想要一个UDF,因为我将一个特殊的input数组该function – 不只是一个选定的范围。 我的问题是,权重是closures的,数组中的数字比数组中的更早被返回,我不能看到我的代码中哪里出了错。 到目前为止,这是UDF: Public Function PROBABLE(ParamArray inputArray() As Variant) As Long 'Takes a set of relative or absolute probabilities and ranks a random number within them Application.Volatile (True) Dim outputArray() As Variant Dim scalar As Single Dim rankNum As Single Dim runningTot As Single ''''' 'Here I take inputArray() […]
我试图定义我自己的数据types,并把它放在一个字典作为一个值。 VBA抱怨说它不接受我的数据types。 任何想法如何得到这个工作? Option Explicit Public Type Translation german As String french As String italian As String End Type Private resource As Object Public Sub addTranslation(key As String, g As String, f As String, i As String) Dim trx As Translation trx.german = g trx.french = f trx.italian = i resource.add key, trx '<== here […]
然后单元格A1内容是=test(2)其中test是函数: Function test(ByRef x As Double) As Double Range("A2") = x test = x * x End Function 你能解释为什么这给了#VALUE! 在单元格A1和单元格A2没有任何内容? 我期望A2包含2和A1包含4 。 没有行Range("A2") = x该函数按预期工作(平方单元的值) 。 真正让我困惑的是,如果你用子程序calltest包装test ,那么它工作: Sub calltest() t = test(2) Range("A1") = t End Sub Function test(ByRef x As Double) As Double Range("A2") = x test = x * x End Function […]
我只是好奇,如果有可能dynamic调用函数的方式。 例如。 Sub foo1() Debug.Print "in foo1" End Sub Sub foo2() Debug.Print "in foo2" End Sub 有没有办法可以做到这样的事情: Sub callSomeFoo(i as Integer) Call foo&i End Sub 或者是这样的必要的东西: Sub callSomeFoo(i as Integer) Select Case i Case 1 Call foo1 Case Else Call foo2 End Select End Sub 没有紧迫的事情…只是好奇。 任何其他有创意的事情都可以做function调用。 谢谢! 编辑1:这是我有的代码和下面列出的错误: Sub foo1() Debug.Print "in foo1" End […]