21

我用 Python 写了很多代码,也因此非常习惯 Python 的语法、对象结构等。

什么是为我提供基础知识的最佳在线指南或资源站点,以及 VBA 与 Python 中等效功能/特性的比较或查找指南。

例如,我无法将 Python 中的简单列表等同于 VBA 代码。我也有数据结构的问题,比如字典等等。

有哪些资源或教程可以为我提供将 python 功能移植到 VBA 的指南,或者只是从强大的 OOP 语言背景适应 VBA 语法?

4

8 回答 8

25

VBA 与 Python 完全不同,因此您至少应该阅读您将要使用的应用程序(Excel、Access...)提供的“Microsoft Visual Basic 帮助”。

一般来说,VBA 相当于 Python 模块;它们被称为“库”,它们不像 Python 模块那样容易创建。我之所以提到它们,是因为库将为您提供可以使用的更高级别的类型。

作为启动助推器,有两种类型可以替代listdict

list

VBA 的类型为Collection. 默认情况下它是可用的(它在库中VBA)。所以你只需做一个
dim alist as New Collection
,从那时起,你就可以使用它的方法/属性:

  • .Add(item)( list.append(item) ),
  • .Count( len(list) ),
  • .Item(i)( list[i] ) 和
  • .Remove(i)(删除列表[i])。非常原始,但它就在那里。

您还可以使用 VBA Array 类型,它像 python 数组是相同类型项目的列表,与 python 数组不同,您需要ReDim更改它们的大小(即您不能只是追加和删除项目)

dict

要拥有类似字典的对象,您应该将脚本库添加到您的 VBA 项目中¹。之后,您可以
Dim adict As New Dictionary
然后使用它的属性/方法:

  • .Add(key, item)( dict[key] = item ),
  • .Exists(key)( dict.has_key[key] ),
  • .Items()( dict.values() ),
  • .Keys()( dict.keys() ),
    以及您将在对象浏览器²中找到的其他内容。

¹ 打开 VBA 编辑器 (Alt+F11)。转到工具→参考,并检查列表中的“Microsoft Scripting Runtime”。

² 要查看对象浏览器,在 VBA 编辑器中按 F2(或查看→对象浏览器)。

于 2008-10-09T09:52:30.017 回答
2

本教程不适合“python 程序员”,但我认为它是一个非常好的 vba 资源:

http://www.vbtutor.net/VBA/vba_tutorial.html

这个网站使用列表回顾了一个真实的例子:

http://www.ozgrid.com/VBA/count-of-list.htm

于 2008-09-16T20:54:10.660 回答
2

可能不完全是您正在寻找的,但如果您有一些编程背景,这是一个不错的 VBA 站点。这不是这个=那个的列表,而是更多的问题/解决方案

http://www.mvps.org/access/toc.htm

于 2008-09-16T20:57:01.920 回答
2

虽然我不是 Python 程序员,但您也许可以使用 Iron Python 和 Visual Studio 运行 VSTO。至少这样,您不必学习 VBA 语法。

于 2008-10-09T21:36:01.017 回答
2

作为 Office 2000、2003 和 VB6 的一部分实施的 VBA 已被弃用,取而代之的是 .Net 技术。除非您坚持使用 python 维护旧代码,或者甚至使用 IronPython for .Net。如果您使用 IronPython,则在处理各种 COM 对象(例如 Office 中的对象)时,您可能必须在各处编写一些 C#/VB.Net 帮助程序类,否则它应该是非常实用且美观的。几乎所有的 Python 优点都在 IronPython 中结束了。如果您只是在编写一些 COM 脚本,请查看 ActiveState 输出的内容。我过去用它来做一些 COM 工作。特别是使用 Python 作为主动脚本语言(经典 ASP)。

于 2008-09-16T20:57:22.010 回答
1

我认为就常用用法而言,列表的等价物是数组。在 Python 中通常使用列表的地方,您通常会在 VB 中使用数组。但是,与 Python 列表相比,VB 数组非常不灵活,更像 C 中的数组。

' An array with 3 elements
'' The number inside the brackets represents the upper bound index
'' ie. the last index you can access
'' So a(2) means you can access a(0), a(1), and a(2) '

Dim a(2) As String
a(0) = "a"
a(1) = "b"
a(2) = "c"

Dim i As Integer
For i = 0 To UBound(a)
    MsgBox a(i)
Next

请注意,如果您声明元素的初始数量,则无法调整 VB 中的数组大小。

' Declare a "dynamic" array '

Dim a() As Variant

' Set the array size to 3 elements '

ReDim a(2)
a(0) = 1
a(1) = 2

' Set the array size to 2 elements
'' If you dont use Preserve then you will lose
'' the existing data in the array '

ReDim Preserve a(1)

您还将在 VB 中遇到各种集合。例如。http://devguru.com/technologies/vbscript/14045.asp

VB中的字典可以这样创建:

Set cars = CreateObject("Scripting.Dictionary")
cars.Add "a", "Alvis"
cars.Add "b", "Buick"
cars.Add "c", "Cadillac" 

http://devguru.com/technologies/vbscript/13992.asp

于 2008-10-08T23:46:32.440 回答
0

“我无法将 Python 中的简单列表与 VBA 中的某些内容等同起来......”

这不是学习语言的最佳方式。在某种程度上,您正在放弃大量 Python,因为 VBA 中没有类似的东西。

如果在 VBA 中没有像 Python 列表那样的东西,那么——嗯——它是新的东西。而 new 将是 Python 部分的重要价值。

Python内置类型的第一部分可能无法很好地映射到 VBA。这使学习显得令人生畏。但是将自己限制在 VBA 中出现的内容往往会妨碍学习。

于 2008-09-17T00:41:57.323 回答
0

这听起来可能很奇怪,但是由于我在 C++ 中学习了数据结构,所以我很难弄清楚如何在没有指针的情况下创建它们。VB6/VBA 有些东西让我觉得它们不自然。无论如何,我遇到了 MSDN 的这一部分,其中有几个用 VBA 编写的数据结构示例。我发现它很有用。

使用类模块创建动态数据结构

于 2008-10-09T10:15:59.063 回答