- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经实现了一个实现接口(interface)的 VBA 类。我的问题是,在我的实现类存储到接口(interface)类之后,我无法调试创建的类。该类工作正常,如果表现正常。当我尝试在 VBE 调试器的本地窗口中展开变量时,崩溃发生可重现。
如果这是 VBA 中的一个已知错误,那么我会因为没有在谷歌上找到这个而感到羞耻。
如果我的类和界面有设计错误,也许你可以帮我找到它。
我在一个空工作簿中使用一个标准模块和两个类模块。 Attribute Value.VB_UserMemId = 0
只是一个提醒。它不适合通过 export+ioprt 的代码。很抱歉我的评论是用德语 :P 的。正如我所指出的,我不知道代码的哪一部分导致了问题。因此,我提供了一个带有类和接口(interface)的功能齐全的测试例程。IxTable
Option Explicit
Public Property Get Name() As String
End Property
Public Property Get Columns() As xCol()
End Property
Public Property Get Column(ByVal Index) As xCol
End Property
'Attribute Value.VB_UserMemId = 0
Public Property Get Data(ByVal Row As Long, ByVal Column) As String
End Property
Public Property Get RowCount() As Long
End Property
Public Property Get ColumnCount() As Long
End Property
Public Function ToString() As String
End Function
xTable
Option Explicit
Implements IxTable
' Private Speichervariablen
Private c() As xCol ' Spalteneigenschaften
Private d As Variant ' Datenfeld Data(Row,Col)
Private n As String ' Name der Tabelle
' Buffer für Spaltenzugriff
Private lastColNumber As Long
Private lastColName As String
''' <summary>
''' Initialisierung des zweidimentionalen Datenfeldes als Data(1,1)
''' </summary>
Private Sub Class_Initialize()
ReDim d(1 To 1, 1 To 1) As Variant
Erase d
End Sub
''' <summary>
''' Name der abgefragten Tabelle
''' </summary>
Public Property Get Name() As String
Let Name = n
End Property
Public Property Get IxTable_Name() As String
Let IxTable_Name = Me.Name
End Property
''' <summary>
''' Ergänzung für Initialisierung
''' </summary>
Friend Property Let Name(ByVal value As String)
n = value
End Property
''' <summary>
''' Zugriff auf alle Spalten
''' </summary>
Public Property Get Columns() As xCol()
Let Columns = c
End Property
Public Property Get IxTable_Columns() As xCol()
Let IxTable_Columns = Me.Columns
End Property
''' <summary>
''' Zugriff aus einzelne Spalte
''' </summary>
Public Property Get Column(ByVal Index) As xCol
Let Column = c(ColumnIndex(Index))
End Property
Public Property Get IxTable_Column(ByVal Index) As xCol
Let IxTable_Column = Me.Column(Index)
End Property
''' <summary>
''' Umsetzung von Spaltenname zu Index mit Buffer
''' </summary>
''' <param name="index">Name oder Index</param>
''' <returns>Index numerisch</returns>
Private Function ColumnIndex(ByVal Index) As Long
If IsNumeric(Index) Then
Let ColumnIndex = CLng(Index)
If Not ColumnIndex = lastColNumber Then
' Letzten Zugriff aktualisieren
lastColNumber = ColumnIndex
lastColName = c(lastColNumber).Name
End If
Else
' Gleiche Spalte wie letzter Zugriff?
If Index = lastColName Then
' Index aus Speicher
ColumnIndex = lastColNumber
Else
' Spalte suchen
lastColName = Index
For lastColNumber = 1 To Me.ColumnCount
If c(lastColNumber).Name = Index Then Exit For
Next
Let ColumnIndex = lastColNumber
End If
End If
If ColumnIndex > UBound(c) Then ColumnIndex = 0
End Function
''' <summary>
''' Ergänzung für Initialisierung
''' </summary>
Friend Sub SetColumn(ByVal Index As Long, value As xCol)
c(Index).Index = Index
c(Index).Name = value.Name
c(Index).Length = value.Length
c(Index).Offset = value.Offset
c(Index).Decimals = value.Decimals
c(Index).Inttype = value.Inttype
c(Index).xType = value.xType
c(Index).Text = value.Text
lastColNumber = 0
lastColName = vbNullString
End Sub
''' <summary>
''' Zugriff auf das Datenfeld
''' </summary>
'Attribute Value.VB_UserMemId = 0
Public Property Get Data(ByVal Row As Long, ByVal Column) As String
Column = ColumnIndex(Column)
Let Data = d(Row, Column)
End Property
Public Property Get IxTable_Data(ByVal Row As Long, ByVal Column) As String
Let IxTable_Data = Me.Data(Row, Column)
End Property
''' <summary>
''' Ergänzung für Initialisierung
''' Daten sind READ ONLY
''' </summary>
Friend Property Let Data(ByVal Row As Long, ByVal Column, ByVal value As String)
Column = ColumnIndex(Column)
d(Row, Column) = Trim(value)
End Property
''' <summary>
''' Anzahl der Spalten
''' </summary>
Public Property Get ColumnCount() As Long
On Error Resume Next
Let ColumnCount = UBound(c)
On Error GoTo 0
End Property
Public Property Get IxTable_ColumnCount() As Long
Let IxTable_ColumnCount = Me.ColumnCount
End Property
''' <summary>
''' Anzahl der Zeilen
''' </summary>
Public Property Get RowCount() As Long
On Error Resume Next
Let RowCount = UBound(d, 1)
On Error GoTo 0
End Property
Public Property Get IxTable_RowCount() As Long
Let IxTable_RowCount = Me.RowCount
End Property
''' <summary>
''' Ergänzung für Initialisierung
''' </summary>
Friend Sub SetSize(ByVal Rows As Long, ByVal Columns As Long)
ColumnCount = Columns
Me.SetRowCount Rows
End Sub
Friend Sub SetRowCount(ByVal Rows As Long)
RowCount = Rows
End Sub
Private Property Let ColumnCount(ByVal value As Long)
ReDim c(1 To value)
lastColNumber = 0
lastColName = vbNullString
End Property
Private Property Let RowCount(ByVal value As Long)
If value > 0 Then
ReDim d(1 To value, 1 To Me.ColumnCount) As String
Else
On Error Resume Next
Erase d
On Error GoTo 0
End If
End Property
''' <summary>
''' Ausgabe des Datenfeldes als String
''' </summary>
''' <returns>
''' Col1\tCol2\t...\tColn
''' d(1,1)\td(1,2)\td(1,n)
''' ...
''' d(m,1)\td(m,2)\td(m,n)
''' </returns>
Public Function ToString() As String
Dim r As Long, i As Long, typing As String, descriptions As String
For i = 1 To Me.ColumnCount
If i = 1 Then
ToString = c(i).Name
typing = c(i).Inttype & "(" & c(i).Length & ")"
descriptions = c(i).Text
Else
ToString = ToString & vbTab & c(i).Name
typing = typing & vbTab & c(i).Inttype & "(" & c(i).Length & ")"
descriptions = descriptions & vbTab & c(i).Text
End If
Next
ToString = ToString & vbCrLf & typing & vbCrLf & descriptions
For r = 1 To Me.RowCount
ToString = ToString & vbCrLf
For i = 1 To Me.ColumnCount
If i = 1 Then
ToString = ToString & Me.Data(r, i)
Else
ToString = ToString & vbTab & Me.Data(r, i)
End If
Next
Next
End Function
Public Function IxTable_ToString() As String
Let IxTable_ToString = Me.ToString
End Function
Module1
Option Explicit
Public Enum xType
'String RFC
TypeChar = 0
'Date RFC
TypeDate = 1
'Numerical
TypeNum = 2
End Enum
''' <summary>
''' Spalteneigenschaften
''' </summary>
Public Type xCol
Index As Long
Name As String
Decimals As Integer
Length As Integer
Offset As Long
Inttype As String
xType As xType
TypeName As String
Text As String
End Type
Sub testIt()
Dim x As xTable, ix As IxTable
'works fine
Set x = xTableTest
'output is nice
Debug.Print x.ToString
'works fine
Set ix = x
' ---> At this point x can be viewed in the locals window (all the time!)
' ---> ix causes Excel to crash and restart
'output is nice
Debug.Print ix.ToString
End Sub
Function xTableTest() As xTable
Dim x As New xTable
Dim c1 As xCol, c2 As xCol
x.SetSize 3, 2
c1.Name = "INDEX"
c1.Length = 8
c1.Text = "Index value"
c1.Index = 1
c1.Offset = 0
c1.Inttype = "Integer"
c1.xType = xType.TypeNum
x.SetColumn 1, c1
c2.Name = "TEXT"
c2.Length = 20
c2.Text = "Text value"
c2.Index = 2
c2.Offset = 8
c2.Inttype = "String"
c2.xType = xType.TypeChar
x.SetColumn 2, c2
Let x.Data(1, c1.Index) = 100
Let x.Data(1, c2.Index) = "einhundert"
Let x.Data(2, c1.Index) = 200
Let x.Data(2, c2.Index) = "zweihundert"
Let x.Data(3, c1.Index) = 210
Let x.Data(3, c2.Index) = "zweihundertzehn"
Set xTableTest = x
End Function
Public Property Get Columns() As xCol()
在界面中解决了崩溃。但仍然没有其他属性显示值。所有房源显示
object doesn't support this property or method
即使 x 值显示数据。
最佳答案
我能够使用您的代码重现相同的行为(崩溃)。删除成员后Columns
, Column
, 和 Data
来自 IxTable
界面,不再崩溃。但是,当扩展接口(interface)对象 ix
在调试器中,我们得到消息对象不支持此属性或方法,而不是值,与 How to get property values of classes that implement an interface in the Locals window? 中报告的完全一样。 ,对此没有答案。因此,即使 Excel 没有崩溃,在调试器本地窗口中扩展接口(interface)变量也是没有用的。
我还找到了文章Interfaces in VBA - How to use them and how to work around them在 Expert Exchange 上,报告了与 VBA 接口(interface)相关的几个问题。
恐怕VBA接口(interface)并不是VBA最稳定的特性。
上面的专家交流文章提出了 VBA 接口(interface)的替代解决方案,我认为值得一看,因为最终结果是相同的。文章太长,无法在此处复制,但专家交流网站“永久”足以仅在此处留下文章的链接。
关于vba - 查看接口(interface)类时,VBE 和 Excel 在调试时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57120144/
SQLite、Content provider 和 Shared Preference 之间的所有已知区别。 但我想知道什么时候需要根据情况使用 SQLite 或 Content Provider 或
警告:我正在使用一个我无法完全控制的后端,所以我正在努力解决 Backbone 中的一些注意事项,这些注意事项可能在其他地方更好地解决......不幸的是,我别无选择,只能在这里处理它们! 所以,我的
我一整天都在挣扎。我的预输入搜索表达式与远程 json 数据完美配合。但是当我尝试使用相同的 json 数据作为预取数据时,建议为空。点击第一个标志后,我收到预定义消息“无法找到任何内容...”,结果
我正在制作一个模拟 NHL 选秀彩票的程序,其中屏幕右侧应该有一个 JTextField,并且在左侧绘制弹跳的选秀球。我创建了一个名为 Ball 的类,它实现了 Runnable,并在我的主 Draf
这个问题已经有答案了: How can I calculate a time span in Java and format the output? (18 个回答) 已关闭 9 年前。 这是我的代码
我有一个 ASP.NET Web API 应用程序在我的本地 IIS 实例上运行。 Web 应用程序配置有 CORS。我调用的 Web API 方法类似于: [POST("/API/{foo}/{ba
我将用户输入的时间和日期作为: DatePicker dp = (DatePicker) findViewById(R.id.datePicker); TimePicker tp = (TimePic
放宽“邻居”的标准是否足够,或者是否有其他标准行动可以采取? 最佳答案 如果所有相邻解决方案都是 Tabu,则听起来您的 Tabu 列表的大小太长或您的释放策略太严格。一个好的 Tabu 列表长度是
我正在阅读来自 cppreference 的代码示例: #include #include #include #include template void print_queue(T& q)
我快疯了,我试图理解工具提示的行为,但没有成功。 1. 第一个问题是当我尝试通过插件(按钮 1)在点击事件中使用它时 -> 如果您转到 Fiddle,您会在“内容”内看到该函数' 每次点击都会调用该属
我在功能组件中有以下代码: const [ folder, setFolder ] = useState([]); const folderData = useContext(FolderContex
我在使用预签名网址和 AFNetworking 3.0 从 S3 获取图像时遇到问题。我可以使用 NSMutableURLRequest 和 NSURLSession 获取图像,但是当我使用 AFHT
我正在使用 Oracle ojdbc 12 和 Java 8 处理 Oracle UCP 管理器的问题。当 UCP 池启动失败时,我希望关闭它创建的连接。 当池初始化期间遇到 ORA-02391:超过
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 9 年前。 Improve
引用这个plunker: https://plnkr.co/edit/GWsbdDWVvBYNMqyxzlLY?p=preview 我在 styles.css 文件和 src/app.ts 文件中指定
为什么我的条形这么细?我尝试将宽度设置为 1,它们变得非常厚。我不知道还能尝试什么。默认厚度为 0.8,这是应该的样子吗? import matplotlib.pyplot as plt import
当我编写时,查询按预期执行: SELECT id, day2.count - day1.count AS diff FROM day1 NATURAL JOIN day2; 但我真正想要的是右连接。当
我有以下时间数据: 0 08/01/16 13:07:46,335437 1 18/02/16 08:40:40,565575 2 14/01/16 22:2
一些背景知识 -我的 NodeJS 服务器在端口 3001 上运行,我的 React 应用程序在端口 3000 上运行。我在 React 应用程序 package.json 中设置了一个代理来代理对端
我面临着一个愚蠢的问题。我试图在我的 Angular 应用程序中延迟加载我的图像,我已经尝试过这个2: 但是他们都设置了 src attr 而不是 data-src,我在这里遗漏了什么吗?保留 d
我是一名优秀的程序员,十分优秀!