【问题标题】:How to update cell references when moving cells into same sheet as target?将单元格移动到与目标相同的工作表时如何更新单元格引用?
【发布时间】:2016-10-26 18:39:25
【问题描述】:

如何强制 Excel 工作簿将自身用作工作表链接的来源?

我正在编写一个 VBA 宏来自动化将 Excel 工作表添加到工作簿中的过程。工作表(工作表 1)仅从调查表的几个工作表(响应 1、响应 2、响应 3)中获取某些(但非常多)响应。因此,sheet1 包含许多单元格引用,这些引用直到宏运行后才会出现在任何地方。

例如 sheet1 "='response1'!b6" 中的 a1。这将返回一个#REF!宏运行之前的错误(这很好)。 运行宏后,sheet1 现在位于正确的工作簿中,并且“='response1'!b6”现在是有效的单元格引用。

直到我手动单击 Sheet1 中的单元格,按 f2,然后按 enter 之后,excel 才意识到这一点。当我这样做时,单元格被正确填充。问题是有大量的细胞。

  1. 是否可以构建一个 VBA 宏来模拟选择公式框并按“Enter”的过程。查找有类似问题的人,大多数都通过 f9、重新打开自动计算或 ActiveSheet.Calculate 或变体的某种组合解决了问题。这些都不起作用,这似乎是引用的问题,即使引用指向有效位置。

  2. 否则,是否可以使用 VBA 执行与以下相同的过程: 数据 > 编辑链接 > 更新值 但在这种情况下,我们需要将当前打开的工作簿指定为它自己的源。有没有办法做到这一点?

  3. 当我在“编辑链接 > 更新值”下手动选择当前工作簿作为源时,excel 奇怪地重复单元格引用中的工作表名称,如下所示:“='[response1]response1!B31”,其中然后当单元格 b31 更改时无法更新,因此这不是解决方案。

这是在按下按钮时运行的代码:

Private Sub CommandButton1_Click()
'copy worksheet into responses
Dim CopyFromWbk As Workbook
Dim CopyToWbk As Workbook
Dim CopyToWbk As Workbook

 Set CopyFromWbk = Workbooks("Addition.xlsm")
 Set ShToCopy = CopyFromWbk.Worksheets("Sheet1")
 Set CopyToWbk = Workbooks("QuestionnaireResponses.xlsm")
 ShToCopy.Copy After:=CopyToWbk.Sheets(CopyToWbk.Sheets.Count)

Workbooks("QuestionnaireResponses.xlsm").Activate

'Put code to update links in here
ThisWorkbook.UpdateLink Name:="myfilepathgoeshere.QuestionnaireResponses.xlsm", Type:=xlExcelLinks
'End update links

感谢您的帮助,这是一个令人头疼的问题。

【问题讨论】:

  • 我之前也遇到过这个问题。我认为(不记得很确定,因此评论)做TextToColumns 会解决这个问题。
  • 太棒了,完美运行。对于遇到此问题的其他人,我专门做的是创建一个“For”循环来循环浏览我的工作表的列,然后为每一列执行一个 TextToColumns,其中仅指定的参数是与源单元格相同的目标。非常感谢凯尔!

标签: excel excel-2010 vba


【解决方案1】:

@Kyle 的好主意。对于那些无法强制更新单元格引用的人,TextToColumns 有效。

然而TextToColumns 如果源范围为空,则会出现错误,因此如果有可能出现这种情况,请使用不附加任何操作的 if 语句跳过这些实例。 p>

我的成功代码如下所示:

Dim i As Integer

For i = 1 To 1004 
'Scans through row 2 from col A onwards
'If cell is empty, does nothing. 
'If cell is not empty, performs TextToColumns where source range = target range.
If IsEmpty(Workbooks("QuestionnaireResponses.xlsm").Worksheets_
("response1").Cells(2, i)) Then 'Does nothing if the cell is empty.
Else
Workbooks("QuestionnaireResponses.xlsm").Worksheets("response1").Cells(2, i).Select
Selection.TextToColumns Cells(2, i) 'Performs TextToColumns
End If

Next

我所有的数据都在同一个长行上。要将上述内容应用于整个电子表格,只需将For i = 1Next 之间的所有内容嵌套在另一个For 循环中,并用不同的字母替换i

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-24
    • 1970-01-01
    • 1970-01-01
    • 2021-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多