【问题标题】:creating a macro to copy and paste a range of cells into the next available blank cell创建一个宏以将一系列单元格复制并粘贴到下一个可用的空白单元格中
【发布时间】:2020-11-18 23:39:49
【问题描述】:

我对宏非常陌生 - 如果我自己这么说的话,我就是 excel 的奇才哈哈哈,但以前从未做过宏和脚本编写,基本上我有 2 张,一张是安排工作,另一张是告诉在制造需要制造哪些作业时,切割表会使用基于调度表中特定单元格的过滤公式自动填充。

我想做的是创建一个按钮,我们只需单击它,新的一周就会出现在日程安排选项卡中,然后会出现在切割表选项卡中,但是当我录制宏时,它只是复制并粘贴到相同的单元格,我不知道如何将其复制并粘贴到前一周的下方,我已附上表格..我希望我做对了

有人可以告诉我如何记录宏,以便它复制并粘贴前一周的行:)

https://docs.google.com/spreadsheets/d/1iBs0-HJOowa-GrQp-0avi4oVy9XZzzbYK669D9KJlT8/edit?usp=sharing

【问题讨论】:

  • 重复添加几周(在底部?)的日程安排和切割表的目的是什么?您希望这张表中包含一年的数据吗?由于每周有许多公式,随着工作表的增长,性能可能会成为一个问题。每个标签执行一周或每个标签一个月可能会更有效吗?复制标签以添加一周或一个月会很简单。通过良好的命名约定,所有选项卡中的数据都可以轻松自动化,只要结构相同。
  • 我也相信您的许多公式可以使用 GoogleSheets 中的 ArrayFormulas 的优势进行合并,这可能有助于提高性能和可维护性。但如果他们也推荐的话,我会让这里的一些专家发表意见。
  • 嗨,感谢您的评论,我们需要将切割表全部放在同一个选项卡上,并且一次总是 6 个月的数据,这是为了看看我们是否有任何重复的工作制造的。我发现只有当切割表都在同一个选项卡上时才会发生这种情况,为了让过滤器准确地工作,它正在过滤的信息需要在同一个选项卡上......这听起来对你吗?我希望我有耐心添加数组公式,但这已经花了很长时间哈哈哈我不知道我有精力!!
  • 嗯,我很想看到您的工作表副本中填写了大量示例数据。我很确定您可以拥有一个汇总表,可以轻松找到所有选项卡中的任何重复项,尤其是因为它们都具有相同的结构。但我理解当你投入大量时间时不愿意改变。我只是有一种感觉,当您在此表中添加六个月的数据时,您可能会遇到此设计的问题。祝你好运。
  • 老实说 - 如果你知道更好的方法,我很想听听,这需要大量的谷歌搜索才能找到不同的公式,大量的试验和错误来尝试找出最好的方法做到这一点......这就是我能想到的,你在谷歌表格上的明显比我先进得多,所以如果你有任何建议,我很想听听......我毫不怀疑,一旦我们真正开始使用在业务范围内,我会发现需要更改/修复的多项内容。

标签: google-apps-script google-sheets


【解决方案1】:

这是非常基本的,但我发现我能够录制一个似乎可以做你想做的事情的宏。我刚刚为切割表完成了它,但同样的逻辑应该适用于日程表。

宏/脚本如下:

function AddWeekCuttingSheet() {
  var spreadsheet = SpreadsheetApp.getActive();
  spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Cutting Sheet'), true);
  spreadsheet.getRange('A2').activate();
  spreadsheet.getCurrentCell().getNextDataCell(SpreadsheetApp.Direction.DOWN).activate();
  spreadsheet.getActiveSheet().insertRowsAfter(spreadsheet.getActiveRange().getLastRow(), 1);
  spreadsheet.getActiveRange().offset(spreadsheet.getActiveRange().getNumRows(), 0, 1, spreadsheet.getActiveRange().getNumColumns()).activate();
  spreadsheet.getRange('2:84').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
};

如果您使用“工具”>“脚本”编辑器,并粘贴到上面的脚本中,根据需要重命名它,然后保存 - 它应该可以作为宏从您的菜单栏中运行。第一次可能需要授权。复印一份您的工作表以首先对其进行测试。为了简化您的测试,您可以在 Cut Sheet 中删除第 85 行及更高的行(第 2 周及以上),但这不是必需的。

宏转到工作表“切割表”,转到 A 列,转到最后一个数据单元格,添加一个空白行,然后将第 2 行的内容粘贴到该位置的第 84 行。

我确信有更好的解决方案,其他人可能会提出这些解决方案,但这可能会对您有所帮助。

【讨论】:

  • 请注意,由于切割表 O3 中的日期公式,复制下来时这不起作用。第一周在上面两行有参考日期,而其他周在上面 83 行参考日期。您可以编辑宏以将第 85 行复制到第 167 行(而不是从 2 到 84),或者,您可以将 O3 中的公式替换为以下内容,该公式根据该单元格的行号计算日期。尝试: =$O$1 + (row()+80)/83 +2 在单元格 O3 或 O86 或 O169 中...这也适用于宏。
  • 非常感谢 - 当我星期一回来工作时,我会试试的!!!当第一个新的一周在那里时,我只需将星期一日期 = 星期五日期 + 3 然后该公式在每个星期一创建... /跨度>