将单元格移动到与目标相同的工作表时如何更新单元格引用?

时间:2016-10-20 15:24:29

标签: excel excel-vba excel-2010 vba

如何强制excel工作簿将自己用作工作表链接的源?

我正在编写VBA宏以自动执行将excel工作表添加到工作簿中的过程。工作表(sheet1)仅从调查问卷的几个表(response1,response2,response3)中获取某些(但非常多)响应。因此,sheet1包含许多单元格引用,这些单元格引用在宏运行之后才能领先。

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

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

  1. 是否可以构建一个VBA宏来模拟选择公式框的过程,然后按"输入"。查找具有类似问题的人,大多数已经通过f9的某些组合,重新开启自动计算,或ActiveSheet.Calculate或变体来解决问题。这些都没有起作用,它似乎是引用的问题,即使引用指向有效位置。

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

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

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

    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
    

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

1 个答案:

答案 0 :(得分:0)

来自@Kyle的好主意。对于那些无法强制更新单元格引用的人,TextToColumns可以正常工作。

但是 TextToColumns如果源范围为空则会产生错误,因此如果有任何可能性,则使用if语句,不附加任何操作以跳过在那些情况下。

我的成功代码如下:

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