Excel VBA中是否可以引用命名表?
假设这可能是......
Sheets("Sheet1").Table("A_Table").Select
Run Code Online (Sandbox Code Playgroud)
我已经看到一些提到表是列表对象,但我不确定这是不是同样的事情......
所以,有这个结构(从A1开始 - 显示片段>运行):
table {
border-color: #BBB;
border-width: 0px 0px 1px 1px;
border-style: dotted;
}
body {
font: 12px Arial, Tahoma, Helvetica, FreeSans, sans-serif;
color: #333;
}
td {
border-color: #BBB;
border-width: 1px 1px 0px 0px;
border-style: dotted;
padding: 3px;
}
Run Code Online (Sandbox Code Playgroud)
<table>
<tbody>
<tr>
<th></th>
<th>A</th>
<th>B</th>
<th>C</th>
<th>D</th>
</tr>
<tr>
<td>1</td>
<td>Title 1</td>
<td>Title 2</td>
<td>Title 3</td>
<td>Title 4</td>
</tr>
<tr>
<td>2</td>
<td>GH</td>
<td>1</td>
<td>434</td>
<td>4</td>
</tr>
<tr>
<td>3</td>
<td>TH</td>
<td>3</td>
<td>435</td>
<td>5</td>
</tr>
<tr>
<td>4</td>
<td>TH</td>
<td>4</td>
<td>4</td> …
Run Code Online (Sandbox Code Playgroud)有多种方法可以将 Excel 数据读取到 Python 中。Pandas 还提供了用于写入和读取的 API
import pandas as pd
from pandas import ExcelWriter
from pandas import ExcelFile
df = pd.read_excel('File.xlsx', sheetname='Sheet1')
Run Code Online (Sandbox Code Playgroud)
效果很好。
但是:将每个工作表的表格直接访问到 pandas 数据框中的方法是什么?
上图显示了一个工作表,其中包含一个与 CELL (1,1) 分开的表。
此外,该工作表可能包含多个表(VBA 中的列表对象)。
我无法在任何地方找到将它们读入熊猫的方法。
注意1:无法修改工作簿以使所有表格都指向单元格(1,1)。注2:我想只使用pandas(如果可能的话)并尽量减少导入其他库的需要。但没有其他办法我准备使用其他lybray。无论如何,我无法使用 xlwings 进行管理。
这里看起来可以解析excel文件,但是没有为表格提供解决方案,仅提供完整的工作表。
pandas 的文档似乎没有提供这种可能性。
谢谢。
如果我手动将公式输入Excel表格中的列(即ListObject),则自动更正将此公式应用于整个列.
有没有办法通过VBA控制这种行为,即我可以以某种方式修改/删除/添加此公式?
我知道我可以简单地更改ListObject.ListColumns(1).DataBodyRange
对象的公式- 但这将覆盖之前输入的任何手动值 - 而在UI中更改公式将保持不变...
我在使用列表对象(又名 Excel 表格)的 excel 应用程序上遇到了性能问题。我怀疑这可能是一个错误,但尽管我在谷歌上搜索,但我找不到任何参考。我已经为我的应用程序开发了一种解决方法,但我感兴趣的是是否有人可以深入了解为什么会发生这种情况。
注意:我在 Windows Vista 上使用 Excel 2007。设置如下:我有一个电子表格,其中包含一个列表对象中的数据,带有可以通过命令按钮启动的 VBA 代码;此代码可以对工作表上的任意数量的单元格进行多次编辑,因此在进行任何编辑之前,Excel 的计算模式设置为手动。
我遇到的问题是,如果当前活动的单元格在列表对象内,那么将计算模式设置为手动似乎没有任何效果。因此,如果用户碰巧在同一实例中打开了大量计算工作簿,则 VBA 代码运行速度非常慢。我几乎不得不拆开我的应用程序,发现这是由活动单元引起的;并且我创建了一个包含此场景简单版本的新工作簿,以确认我的应用程序没有某种损坏。
我一直在用这个做一些测试用例,下面是我发现的结果:
虽然看起来一般都跟计算有关,但是计算模式在手动和自动之间切换还是有时间差的……
手动模式比自动模式快不到 20%。但我的期望是它们或多或少是相同的,考虑到问题似乎是即使在手动模式下也开始计算。
与活动单元格不在列表对象上时相比,结果大不相同......
现在,手动运行速度提高了 50 倍,而自动运行显示计算时间不应超过 3.2 秒!所以现在第一个测试看起来可能在手动模式下运行了两次计算,在自动模式下运行了近 3 次。
再次重复这个测试,这次是在一个单元格中没有计算公式的实例中,突然它看起来没有那么糟糕,
它仍然较慢,但现在只有 10-20%,使其不明显。但这确实表明该问题必须以某种方式与计算相关,否则它应该与第一次测试一样长。
如果有人想创建这些测试以供自己查看,设置如下:
如果Excel中的表(ListObject)的特定列是计算列(如http://office.microsoft.com/en-us/excel-help/use-calculated-columns-),是否可以在VBA中进行检查在-excel-表-HA010342380.aspx)?
请注意,计算列不仅每行具有相同的 R1C1 公式集,而且还会在添加新行时自动扩展(如果删除整个数据主体范围然后重新创建一些新行,它甚至会重新填充)。因此,检查具有一致公式的列与检查计算公式不同。
甚至可以计算一列,但用某些其他公式或值覆盖其中一行,并保留自动扩展功能。
所以我非常确信这一定是该列的某些属性,我只是不确定在哪里可以通过 VBA 访问它。如果它没有通过 VBA 对象模型公开,是否有一些解决方法来获取此信息?
预先感谢,卡洛斯
编辑:我对 Excel Office Open XML 文件进行了一些挖掘,结果发现我正在寻找的是xl\tables\table*.xml 文件定义<calculatedColumnFormula>
上的元素。<tableColumn>
有什么办法可以通过VBA实现这一点吗?
EDIT2:这是一个示例文件,其中包含我可以提出的测试用例。VBA 应指示第 1、2 和 3 列是计算列,而第 4 和 5 列不是。
我有两个表:
Table_1 Table_2
A B C A B C
------------- -------------
1| A1| B1| C1| 1| A2| B2| C2|
2| A1| B1| C1| 2| A2| B2| C2|
3| A1| B1| C1| 3| A2| B2| C2|
Run Code Online (Sandbox Code Playgroud)
结果表:
Table_1
A B C
-------------
1| A1| B1| C1|
2| A1| B1| C1|
3| A1| B1| C1|
4| A2| B2| C2|
5| A2| B2| C2|
6| A2| B2| C2|
Run Code Online (Sandbox Code Playgroud)
Table_2是一个临时表(ListObject),它使用数据连接在数据库中查询条目。
Table_1是一个表(ListObject),用作条目的集合列表。之所以将其分开,是因为(1)缩短了Table_2中的查询时间,并且(2)进行了一些程序编辑。
我有VBA代码,可将Table_2复制到Table_1,然后更新Table_2的连接字符串,以不包括日期在Table_1范围内的条目。结果是Table_2仅提取新数据。
我的代码(正确)将数据从Table_2复制到Table_1:
For Each temprow in Table_2.ListRows
Set newRow = table_1.ListRows.Add
tempRow.Range.Copy
newRow.Range.PasteSpecial …
Run Code Online (Sandbox Code Playgroud) 我在下面有这个代码会自动选择一个范围.有谁知道如何添加代码来创建所选范围的表?
谢谢!
Sub DynamicRange()
'Best used when first column has value on last row and first row has a value in the last column
Dim sht As Worksheet
Dim LastRow As Long
Dim LastColumn As Long
Dim StartCell As Range
Set sht = Worksheets("Sheet1")
Set StartCell = Range("D9")
'Find Last Row and Column
LastRow = sht.Cells(sht.Rows.Count, StartCell.Column).End(xlUp).Row
LastColumn = sht.Cells(StartCell.Row, sht.Columns.Count).End(xlToLeft).Column
'Select Range
sht.Range(StartCell, sht.Cells(LastRow, LastColumn)).Select
End Sub
Run Code Online (Sandbox Code Playgroud) 我需要能够使用VBA代码在excel中的空表中插入一大组值.这是代码到目前为止的工作方式.
首先,用户将值输入到用户表单中.然后代码清除表格,然后根据代码中已有的查找条件找到一系列数字.检索到的数据全部包含在单个列中,并像数组一样存储.
从这里开始,我需要将所有值放入表中的某个列(Policy#),从而将表行扩展为检索数据集中的许多行.(如果需要,我确实将计数单独存储为"AC")我要插入的列标题是"Policy#".
请记住,代码当前表中只有一个空行,如何正确插入数据?我试过了
range("commissionstatement[Policy #]").value = Als
Run Code Online (Sandbox Code Playgroud)
但那不起作用.顺便提一下,Als是一系列价值观.通常要插入我必须插入到大小相等的范围的数组,这就是为什么我已经将行计数作为AC.
我也尝试过使用range("commissionstatement").listobject.listrows
但不起作用.
有什么建议?在我实际将数据放入那里之前,我是否需要在表中插入一些等于我添加的数据的行...
range("commissionstatement").listobject.listrows.add ()
Run Code Online (Sandbox Code Playgroud)
然后插入数据?
如果需要更多信息,请与我们联系.谢谢!
我正在使用Excel 2013/2015 VSTO工作簿应用程序.从在Windows窗体中输入的数据,我想在我的一个工作表的现有表中创建一个新记录.
如何使用C#和VSTO将新表行插入Excel表(不是简单的工作表数组)?
listobject ×10
vba ×9
excel ×8
excel-vba ×4
excel-tables ×2
arrays ×1
c# ×1
excel-2010 ×1
insert ×1
pandas ×1
performance ×1
python ×1
subtotal ×1
vsto ×1
worksheet ×1