英文:
Is there a way to call Excel VBA function from Power Query M?
问题
有没有一种方法可以从Power Query M中调用Excel VBA函数以获取值以供进一步处理?
通过M函数可以获取单元格的值,但我还想从文本框中获取值。
在VBA中,我可以获取文本,但我找不到是否可以从M查询中调用Excel VBA函数。
更详细地说:
实际上,我想获取JSON以在Power Query中解析。如果我选择“从JSON文件获取数据”,它可以完美运行。但它使电子表格依赖于文件的位置,如果我将其发送给其他用户,用户应该将JSON文件放在与我的计算机上相同的位置,这会带来一些复杂性。
我尝试将JSON文件复制到单个Excel单元格中。它可以工作,但似乎有文件大小的限制,我的文件比Excel允许的单元格大。
另一个解决方案是将JSON文本放入文本框中。我可以使用VBA从文本框中提取内容,但无法将其传递给Power Query。
有什么想法吗?
英文:
Is there a way to call Excel VBA function from Power Query M to obtain value for further processing?
It is possible to get cell value via M function, but I also want to get value from Text Box.
In VBA I can get that text, but I could not find if I can call that Excel VBA function from M query.
In more details:
I actually want to get JSON to parse with Power Query. It works perfectly if I go with "Get Data from File JSON". But it makes the spreadsheet dependent on the location of the file, if I send it to other user, the user should place JSON file into the same location as on my computer which present some complications.
I tried to copy that JSON file into single Excel cell. It works but it looks like there is a limitation for the file size, my files are bigger that Excel allows in the cell.
Other solution would be to place that JSON text into Text Box. I can extract the context from Text Box with VBA but I cannot get it into Power Query.
Any ideas?
答案1
得分: 3
在Power Query中,您可以让某人将位置放入一个命名范围,然后通过以下方式从命名范围(单元格)获取文件路径:
let NameValue = Excel.CurrentWorkbook(){[Name="rangenamehere"]}[Content]{0}[Column1],
Source = Excel.Workbook(File.Contents(NameValue), null, true),
或者,如果您想要使用VBA来进行文件提示,可以让VBA调用Power Query,而不是反过来:
-
创建一个命名范围,比如aaa。
-
使用VBA通过文件提示来填充它:
Sub prompt()
Dim FName As Variant
FName = Application.GetSaveAsFilename("", "Data file (*.xl*),*.xl*", 1)
If FName = False Then
MsgBox "False"
Exit Sub
End If
Range("aaa").Value = FName
End Sub
- 在Power Query中引用您设置的命名范围:
let NameValue = Excel.CurrentWorkbook(){[Name="aaa"]}[Content]{0}[Column1],
Source = Excel.Workbook(File.Contents(NameValue), null, true),
- 在VBA的最后添加以下代码来刷新所有查询或特定查询:
刷新所有查询:
ActiveWorkbook.RefreshAll
或刷新特定查询:
ActiveWorkbook.Queries("QueryNameHere").Refresh
英文:
In powerquery you can have someone put a location in a named range, then grab the filepath from the named range (cell) by using
let NameValue= Excel.CurrentWorkbook(){[Name="rangenamehere"]}[Content]{0}[Column1],
Source = Excel.Workbook(File.Contents(NameValue), null, true),
Or if you wanted the VBA route for file prompt, have the VBA call the PowerQuery, not the other way around
1 Create a range name, here aaa
2 Use VBA to populate it using a file prompt
Sub prompt()
Dim FName As Variant
FName = Application.GetSaveAsFilename("", "Data file (*.xl*),*.xl*", 1)
If FName = False Then
MsgBox "False"
Exit Sub
End If
Range("aaa").Value = FName
End Sub
3 Refer to the named range in powerquery you set up
let NameValue= Excel.CurrentWorkbook(){[Name="aaa"]}[Content]{0}[Column1],
Source = Excel.Workbook(File.Contents(NameValue), null, true),
4 Tack on code at end of VBA to refresh all queries or specific query
ActiveWorkbook.RefreshAll
or
ActiveWorkbook.Queries("QueryNameHere").Refresh
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论