【问题标题】:How do I import the nth sheet from an excel workbook with doCmd.transferSpreadsheet如何使用 doCmd.transferSpreadsheet 从 Excel 工作簿中导入第 n 张工作表
【发布时间】:2016-03-31 13:09:45
【问题描述】:

我想从具有doCmd.transferSpreadsheet 的 Excel 工作簿的第 n 个工作表中导入数据。此命令需要 工作表的名称 作为 6th 参数。不幸的是,工作表的名称一直在变化(想想last edited by XYZ, March 29),所以我没有机会知道我感兴趣的工作表的名称。

有没有办法通过工作表位置而不是工作表名称来指示范围?

【问题讨论】:

  • 如果知道sheet的index,可以使用Sheets(index).Name获取sheet的名字或者Sheets(index)直接引用sheet
  • @gizlmeier 我很害怕,但这不起作用。它似乎试图找到一个字面名称为sheets(index)的工作表
  • 显然你必须用数字替换索引,我只是写了索引以明确将它放在哪里 1 例如是第一张表
  • 是的,我确实将index替换为相应的号码。
  • 很奇怪。它应该像这样工作 Sheets(1).Name

标签: excel vba ms-access import


【解决方案1】:

假设您不知道索引,只知道位置(不等价,抱歉),您需要查看工作簿中的每个工作表。像这样的:

SheetNameBaseString="whatever you know from the sheet name that won't change"
for each sheetVariable in workbookObject.Sheets
if instr(sheetVariable, SheetNameBaseString)<>0 _ 
then theSheetThatIWant=sheetVariable.index
next sheetVariable
docmd.transferspreadsheet ......., sheets(theSheetThatIWant) ........

现在,如果您有多个具有相同“基本”名称的工作表......您的手上就有问题了。 :) 再说一次,如果您让用户创建新工作表,那么最近创建的工作表应该是您想要的工作表。在许多情况下,该工作表的索引可能等同于工作簿中的最高工作表索引。所以只要把这个 if 语句放在上面的那个里面,然后说if sheetvariable.index&gt;theSheetThatIWant then theSheetThatIWant=sheetVariable.index

这里的另一个选项可能是在循环中使用 `format(instrrev(sheetVariable.name,",")) 并获取最新的,如果您在上面给出的格式是 100% 准确的,并且如果您知道您的工作表are looking for 始终是最近重命名的那个,并且如果它始终具有您要查找的格式的正确数据。

但是,归根结底,如果您无法控制用户的命名约定,或者工作簿的用途太多,以至于您无法预测用户将执行的操作和顺序,您可能需要重新考虑整个工作簿。您知道,不仅 Access 不是唯一可以“拆分”的 Office 项目……您可能必须将前端与数据分开,并自己更改工作表/表/数据的名称。如果您要继承某人的工具,这并不理想,但它可能比不断猜测工作表“位置”并弄错……并在此过程中让客户看起来很愚蠢要好。

【讨论】:

  • 我认为这被否决了,因为有人否认可能存在隐藏的工作表和图表表。我说,如果你对环境有足够的控制权,知道这些东西永远不会存在,那么你可以而且应该控制用户的命名约定。看在上帝的份上,使用一个按钮! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-25
  • 1970-01-01
  • 2013-10-23
  • 1970-01-01
  • 2021-11-18
  • 1970-01-01
相关资源
最近更新 更多