使用INDIRECT在已关闭的Excel工作簿中引用值?

时间:2015-02-11 18:26:56

标签: excel excel-formula

我想在另一个带有公式(不是VBA!)的 已关闭 工作簿中引用单元格值。 工作表名称存储为变量(在以下示例中,C13是“Sheet2”)。

如果其他文件已打开,则后续工作:

=INDIRECT("[myExcelFile.xlsm]" & C13 & "!$A$1")

如果文件已关闭,则上述公式不起作用,因为没有给出绝对路径。但我得到了以下工作(注意'而不是':

='C:\data\[myExcelFile.xlsm]Sheet2'!$A$1

现在我想用动态引用的值替换硬编码的“Sheet2”,意思是C13(如第一个代码片段所示)。

有人在不使用VBA或其他库的情况下知道解决方案吗?

11 个答案:

答案 0 :(得分:10)

明确no way to do this标准公式。但是,可以找到一种疯狂的答案here。它仍然可以避免使用VBA,它可以让你动态地获得结果。

  1. 首先,制作将生成公式的公式,但不要在开头添加=

  2. 让我们假装您已在B2的单元格Sheet1中创建了此公式,并且您希望在c列中评估公式。

  3. 现在,转到“公式”选项卡,然后选择“定义名称”。将其命名为myResult(或您选择的任何内容),在“引用至”下,写下=evaluate(Sheet1!$B2)(请注意$

  4. 最后,转到C2,然后撰写=myResult。向下拖动,然后...... 瞧!

答案 1 :(得分:1)

谢谢你提出的好问题。我想澄清并附上 Philipp 发布的解决方案。解决方案如下:

  1. 更新关闭 Excel 文件中的数据,以及
  2. 是否“动态地”(虽然不完全 - 你会看到)

在上面的回答中,Philipp 说:“问题是指向关闭文件的链接适用于 index( 但不适用于 index(indirect("

我相信这仍然是真的。 (我在 2021 年 3 月在这里使用 Office 365。如果 Microsoft 允许 INDIRECT 和 INDEX 与关闭的文件一起很好地发挥作用,那就太好了!)

实际上,我可以确认 Philipp 的解决方法确实有效。从用户的角度来看,感觉就像 OP 克里斯想要做的一样。

假设您希望从 Sheet1、Sheet2 或 Sheet3 中绘制给定单元格的内容,这些内容来自关闭的文件 myExcelFile.xlsm。您将通过更改特定单元格的内容来选择哪个工作表(C13,如 OP Chris 的问题中所述)。一种方法是将其设为下拉列表(使用数据 > 数据验证 > 允许 [列表])。该列表将具有以下名称:

表 1 表 2 Sheet3

(这将在没有下拉列表的情况下进行概括。例如,您只需在 C13 中键入“Sheet2”,就会出现关闭文件中的相关数据;如果您然后键入“Sheet3”,则来自 < em>那个工作表将改为出现。或者你可以有一列包含工作表名称,下一列在[使用下面的公式,调整]以用于关闭文件的输出。)

将包含来自另一个封闭工作表 (myExcelFile.xlsm) 的引用数据的单元格将具有:

=IFS(
C13="Sheet1",'C:\data\[myExcelFile.xlsm]Sheet1'!$A$1,
C13="Sheet2",'C:\data\[myExcelFile.xlsm]Sheet2'!$A$1,
C13="Sheet3",'C:\data\[myExcelFile.xlsm]Sheet3'!$A$1
)

就是这样。

当您第一次在关闭 myExcelFile.xlsm 的情况下执行此操作时,它会抛出一个 #REF 错误,但您可以转到数据 > 查询和连接 > 编辑链接 > 更新值,并且您的关闭文件中的值应该会出现。 (就我个人而言,我设置了一个带有按钮的宏来进行更新,而不是通过菜单搜索。)神奇的是,当您执行更新值时,关闭文件中所有工作表中的数据都会加载到当前Excel 文件 - 这样您就不必每次将引用切换到不同的工作表(例如,Sheet2 到 Sheet3)时都进行更新。

安德鲁

答案 2 :(得分:0)

检查INDEX功能:

=INDEX('C:\path\[file.xlsm]Sheet1'!A10:B20;1;1)

答案 3 :(得分:0)

= INDIRECT(&#34;&#39; C:!\数据[&#34;&安培; A8&安培;&#34;] SHEETNAME&#39; $ G9&#34)

其中A8包含myExcelFile.xlsm

和G9包含您的源工作簿宝贵数据。

答案 4 :(得分:0)

我也在寻找在封闭的工作簿中引用单元格的答案。以下是解决方案(正确公式)的链接。我已经在我当前的项目上尝试过它(引用一个单元格和一组单元格)并且它运行良好而没有错误。我希望它可以帮助你。

https://www.extendoffice.com/documents/excel/4226-excel-reference-unopened-file.html

在公式中,E:\Excel file\是未打开的工作簿的完整文件路径,test.xlsx是工作簿的名称,Sheet2是包含所需单元格值的工作表名称引用,A:A,2,1表示将在已关闭的工作簿中引用单元格A2。您可以根据自己的需要进行更改。

如果您想手动选择要参考的工作表,请使用此公式

=INDEX('E:\Excel file\[test.xlsx]sheetname'!A:A,2,1)

应用此公式后,您将看到“选择工作表”对话框,请选择工作表,然后单击“确定”按钮。然后将立即引用此工作表的特定单元格值。

答案 5 :(得分:0)

至少在Excel 2016中,可以将INDIRECT与完整路径引用结合使用;整个引用(包括工作表名称)都必须用'字符括起来。

所以这应该对您有用:

= INDIRECT("'C:\data\[myExcelFile.xlsm]" & C13 & "'!$A$1")

请注意最后一个字符串中的结尾'(即'!$A$1""包围)

答案 6 :(得分:0)

问题是指向已关闭文件的链接只能使用index(但不能使用index(indirect(

在我看来,这是索引函数的编程问题。 我用if子句行解决了它

C2=sheetname
if(c2=Sheet1,index(sheet1....),if(C2="Sheet2",index(sheet2....

我做了五张纸,这是一个很长的公式,但是可以满足我的需要。

答案 7 :(得分:0)

这似乎适用于关闭的文件:将源的数据透视表(行、表格布局、无小计、无总计)添加到当前工作簿,然后从该数据透视表、INDIRECT、LOOKUPs 中引用您想要的所有内容, ...

答案 8 :(得分:-1)

如果您知道要引用的工作表数量,可以使用以下功能查找名称。你可以在INDIRECT funcion中使用它。

   var http = require("http");

var express = require('express');
var path = require('path');
// var favicon = require('serve-favicon');
// var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');

var routes = require('./routes/index');
var users = require('./routes/users');

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
// app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
// app.use(express.static(path.join(__dirname, 'public')));
app.use(express.static(__dirname+"/"));

app.use('/', routes);
app.use('/users', users);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  var err = new Error('Not Found');
  err.status = 404;
  next(err);
});

// error handlers

// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
  app.use(function(err, req, res, next) {
    res.status(err.status || 500);
    res.render('error', {
      message: err.message,
      error: err
    });
  });
}

app.get('/',function(request,response){
  console.log("/");
res.sendfile('views/index.html', {root: __dirname });
});


// production error handler
// no stacktraces leaked to user

app.use(function(err, req, res, next) {
  res.status(err.status || 500);
  res.render('error', {
    message: err.message,
    error: {}
  });
});
// http.createServer(function (request, response) {
//    // Send the HTTP header 
//    // HTTP Status: 200 : OK
//    // Content Type: text/plain
//    response.end('Hello World\n');
//    response.writeHead(200, {'Content-Type': 'text/plain'});
//     // Send the response body as "Hello World"


// }).listen(8081);
app.listen(5000);

// Console will print the message
console.log('Server running at http://127.0.0.1:5000/');
module.exports =app;

此解决方案不需要打开引用的工作簿 - Excel将自行打开它(但它将被隐藏)。

答案 9 :(得分:-1)

行,

这是Office 2010上的恐龙方法。

使用连接编写所需的完整地址(&#34;&amp;&#34;组合文本的方法)。

为您需要的所有地址执行此操作。它应该看起来像:

=&#34; =&#34;&amp;&#34;&#39; \ FULL NETWORK ADDRESS包括[电子表格名称]&#34;&amp; W3&amp;&#34;&#39;!$ W4&#34;

W3是我正在使用的工作表的动态参考,W4是我想从工作表中获取的单元格。

完成此操作后,启动宏录制会话。复制单元格并将其粘贴到另一个单元格中我将它粘贴到一个合并的单元格中,它给了我经典的#34;相同尺寸&#34;错误。但它做的一件事是从我的连接中粘贴结果文本(包括额外的&#34; =&#34;)。

复制了很多你为此做的。然后,进入每个粘贴的单元格,选择他的文本,然后按Enter键。它将其更新为有效的直接参考。

完成后,将光标置于不错的位置并停止宏。将其分配给按钮即可完成。

PITA是第一次做到这一点,但是一旦你完成它,你刚刚制作了方形钉,适合圆孔。

答案 10 :(得分:-1)

我很失望,所以我做了以下解决方法:

  1. 我创建了 INDIRECT 命令并将它们存储在所需范围之外。当然,当源工作簿关闭时我会收到错误,但当它打开时它们会亮起。
  2. 所以我暂时打开源工作簿。
  3. 然后我创建了一个宏,从范围外复制 INDIRECT 公式并将它们粘贴到范围内。所有单元格都填充了正确的值。
  4. 宏然后将范围的值复制粘贴到自身之上的范围。这会删除公式但保留其值。
  5. 然后我关闭源工作簿。我的值在我想要的地方保持不变,而我的 INDIRECT 公式保持在所需范围之外,以防我想通过重复该过程来刷新它们!

这个解决方法让我避免了源工作簿关闭时间接公式的错误,最重要的是它节省了大量重新计算的时间!

希望这也适用于您!