小编Dav*_*ens的帖子

VBA有三元运算符吗?

我来自Obj C的美丽世界,它基于C编程语言,我爱上了寻找节省空间的古怪方法.但是,我已经查看了尽可能多的文档,我在VBA上找不到任何会缩短这种语法的东西:

If boolVar = True Then
   'Do something
Else
   'Do nothing
End If
Run Code Online (Sandbox Code Playgroud)

在Obj C中,自然是C,我非常熟悉这样做:

boolVar ? "Nope, tis false" : "Yup, tis true"
Run Code Online (Sandbox Code Playgroud)

这与其他大多数联盟使用的非常类似,有些可能会使用额外的逻辑运算符!=,==但这让我很乐观.我可能没有找到合适的地方,如果是这样的话,请告诉我你的文件在哪里.

TLDR,我们可以将If/Then/Else缩短为VBA中的一行代码吗?当"Do Somethings"只不过是设置另一个变量的单个参数,或启用/禁用按钮时,这非常方便.

excel vba excel-vba

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

匹配字符串数组中的值

问题:寻找一种更有效的方法来查找1d数组中是否存在精确匹配值 - 本质上是一个布尔值true/false.

我忽略了一些明显的东西吗 或者我只是使用错误的数据结构,当我可能应该使用集合对象或字典时使用数组?在后者中,我可以分别检查.Contains.Exists方法

在Excel中,我可以检查向量数组中的值,如:

If Not IsError(Application.Match(strSearch, varToSearch, False)) Then
' Do stuff
End If
Run Code Online (Sandbox Code Playgroud)

这将返回一个精确的匹配索引,显然受到Match函数的限制,该函数仅在此上下文中找到第一个匹配值.这是一种常用的方法,也是我长期使用的方法.

这对Excel来说足够令人满意 - 但其他应用程序呢?

在其他应用程序中,我基本上可以做同样的事情,但需要启用Excel对象库的引用,然后:

   If Not IsError(Excel.Application.match(...))
Run Code Online (Sandbox Code Playgroud)

但这看起来很愚蠢,并且由于权限/信任中心/等原因而难以管理分布式文件.

我试过使用Filter()函数:

 If Not Ubound(Filter(varToSearch, strSearch)) = -1 Then
    'do stuff
 End If
Run Code Online (Sandbox Code Playgroud)

但是这种方法的问题是Filter返回部分匹配的数组,而不是完全匹配的数组.(我不知道为什么返回子串/部分匹配会有用.)

另一种选择是逐字迭代数组中的每个值(我认为这也是非常常用的) - 这似乎比调用Excel的Match函数更加麻烦.

For each v in vArray
   If v = strSearch Then
    ' do stuff
   End If
Next
Run Code Online (Sandbox Code Playgroud)

arrays excel vba excel-vba data-structures

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

何时在VBA中使用TextFrame或TextFrame2

例如,在Powerpoint中:

TextFrame对象:

表示Shape对象中的文本框架.包含文本框架中的文本以及控制文本框架对齐和锚定的属性和方法.

TextFrame2对象:

表示Shape或ShapeRange对象中的文本框架.包含文本框架中的文本,并公开控制文本框架对齐和锚定的属性和方法.

所以TextFrame2也引用了ShapeRange对象,它比TextFrame有更多的属性.

我不确定何时或是否应该使用其中一个,例如,操纵powerpoint幻灯片上表格单元格中保存的文本值.两者似乎都有效,并且以下语句返回TRUE.

Dim tbl as Table
Set tbl = ActivePresentation.Slides(1).Shapes("Table1").Table

tbl.Cell(r, c).Shape.TextFrame2.TextRange.Characters.Text = _
    tbl.Cell(r, c).Shape.TextFrame.TextRange.Characters.Text
Run Code Online (Sandbox Code Playgroud)

当我应该使用TextFrame何时使用vs时,是否有一些确定的指南TextFrame2

excel vba excel-vba powerpoint-vba

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

如何使用WorksheetFunction.VLookup错误处理1004错误?

我有这个代码:

Dim wsFunc As WorksheetFunction: Set wsFunc = Application.WorksheetFunction
Dim ws As Worksheet: Set ws = Sheets("2012")
Dim rngLook As Range: Set rngLook = ws.Range("A:M")

'within a loop
  currName = "Example"
  cellNum = wsFunc.VLookup(currName, rngLook, 13, False)
Run Code Online (Sandbox Code Playgroud)

预计VLookup不会总能找到结果; 但是当它没有找到结果时,我甚至可以在错误检查下一行之前将错误输出.

错误:

运行时错误'1004':无法获取WorksheetFunction类的VLookup属性

找到结果时,它工作正常.在这里处理错误的好方法是什么?

excel vba excel-vba

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

Docker for Windows 的端口问题

我正在尝试遵循training.play-with-docker.com 上的初学者教程。在任务 2 的第 6 步,我执行以下操作并得到如下错误:

PS C:\Users\david.zemens\Source\Repos\linux_tweet_app> docker container run --detach --publish 80:80 --name linux_tweet_app $DOCKERID/linux_tweet_app:1.0
d39667ed1deafc382890f312507ae535c3ab2804907d4ae495caaed1f9c2b2e1
C:\Program Files\Docker\Docker\Resources\bin\docker.exe: Error response from daemon: driver failed programming external connectivity on endpoint linux_tweet_app (a819223be5469f4e727daefaff3e82eb68eb0674e4a46ee1a32e703ce4bd384d): Error starting userland proxy: listen tcp 0.0.0.0:80: bind: An attempt was made to access a socket in a way forbidden by its access permissions.
Run Code Online (Sandbox Code Playgroud)

我在本地的 Win10 机器上使用 Docker Desktop。我已尝试按照此处的建议重置 Docker 。错误仍然存​​在。由于其他东西必须使用端口 80,我应该能够通过使用不同的端口来避免错误,对吗?

PS C:\Users\david.zemens\Source\Repos\linux_tweet_app> docker container run --detach --publish 1337:1337 --name …
Run Code Online (Sandbox Code Playgroud)

docker

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

如何使Excel VBA变量可用于多个宏?

我有一串宏相互调用并引用工作簿A和B.我希望第一个宏提示用户选择文档A和B,这些选择将成为我在中引用的工作簿A和B变量各种宏.

如何在所有宏中将所选文档作为引用变量?

提前致谢!

excel vba excel-vba

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

如何检查哪一行VBA代码导致错误

我正在尝试调试我编写的长代码,我需要逐行执行.

问题是我在Mac上,并且在这种情况下不知道如何使用F8.谁能告诉我怎么能这样做呢?我怎么知道哪条线导致执行问题?

debugging vba excel-vba-mac

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

VBA检查数组是否为一维

我有一个数组(来自SQL),可能有一行或多行.

我希望能够弄清楚数组是否只有一行.

UBound似乎没有帮助.对于二维数组UBound(A,1)并分别UBound(A,2)返回行数和列数,但是当数组只有一行时,UBound(A,1)返回列数并UBound(A,2)返回一个<Subscript out of range>.

我还看到了这个Microsoft帮助页面,用于确定数组中的维数.这是一个非常可怕的解决方案,涉及使用错误处理程序.

如何确定数组是否只有一行(希望不使用错误处理程序)?

excel vba excel-vba

9
推荐指数
4
解决办法
6858
查看次数

在PowerPoint中按占位符名称处理形状

我试图根据分配给对象的已知 Name属性创建一个将返回特定形状的CustomLayout.Shapes.Placeholder函数.我无法使用形状,.Name因为即使从模板/布局创建幻灯片,也不会提前知道.

挑战似乎是自定义布局与实际幻灯片的关系.例如,当我迭代幻灯片时.CustomLayout.Shapes.Placeholders,我可以通过它的.Name属性轻松识别特定的占位符.

但是,如果我返回形状,它将是自定义布局占位符,它会影响此布局上的所有幻灯片(例如,如果我向此占位符添加文本,则使用此布局更新所有幻灯片!).显然这是不可取的!

相反,如果我索引集合,并尝试从幻灯片中返回该索引位置的形状.Shapes.Placeholders,则看起来它们没有保持相同的索引,即.Shapes.Placeholders(i) <> .CustomLayout.Shapes.Placholders(i)

尝试的解决方法:

以为我可以操纵自定义布局来添加Tag形状.我尝试了,但由于同样的原因它失败了(即,CustomLayout.Shape在某种程度上不是与Slide.Shape"相同"的形状......).在任何情况下,如果存在这样的事情,我希望避免采用"解决方法"来支持更合适的方法.

这是我到目前为止的功能:

Function GetShapeByPlaceholderName(sName As String, sld As Slide) As Object
Dim plchldrs As Placeholders
Dim shp As Shape
Dim ret As Shape
Dim i As Long

For Each shp In sld.CustomLayout.Shapes.Placeholders
    i = i + 1
    If shp.Name = sName Then
    '#### 
    '    This can easily identify the CustomLayout.Shapes.PLACEHOLDER
    '
    '    But …
Run Code Online (Sandbox Code Playgroud)

vba powerpoint-vba

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

找出Python中是否有来自管道的输入?

(我想)我知道如何从管道中读取.我的意思是像这样打电话给bash

echo Bähm | ./script.py
Run Code Online (Sandbox Code Playgroud)

这个Python3脚本适用于此.

#!/usr/bin/env python3
import sys

x = sys.stdin.read()

if x:
    print(x)
else:
    print('no pipe')

sys.exit()
Run Code Online (Sandbox Code Playgroud)

但是当我在bash上做这件事的时候

./script.py
Run Code Online (Sandbox Code Playgroud)

没有任何反应,因为它等待输入.

所以我想检查(在启动脚本时)是否有来自管道的输入.但我不知道为什么sizelen没有工作sys.stdinsys.stdin.buffer.

也许在处理Python的第2版和第3版之间存在差异?

python pipe python-3.x

8
推荐指数
3
解决办法
4071
查看次数