【问题标题】:Google Scripts or VBA - Insert rows upon entering input value (Excel)Google Scripts 或 VBA - 在输入输入值时插入行 (Excel)
【发布时间】:2025-12-20 02:15:09
【问题描述】:

我正在使用带有 Google 脚本的 Google 表格,我想在用户输入数字时插入行,而无需在脚本编辑器上运行代码。因此,如果我更改所选单元格上的值,代码应该会自动运行,这不会发生。到目前为止,这是我的代码:

function PopulateColumn() { 
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[0];
for (i = 1; i<=SpreadsheetApp.getActiveSheet().getRange(9,2).getValue(); i++) {
sheet.insertRowsAfter(11, SpreadsheetApp.getActiveSheet().getRange(9,2).getValue())
SpreadsheetApp.getActiveSheet().getRange(i+10,1).setValue('Arrangement ' + i + ':')
}
}

这在没有自动部分的情况下工作,但不是插入行,而是覆盖已经写入这些单元格的数据。我想维护这些数据...

我尝试的另一种方法是在计算机上将 VBA 编辑器与 Excel 一起使用,但也存在类似问题。如果在所需单元格上写的不是“安排”,它就不会运行;如果已经有“安排”,它会继续计数。这不是我想要的......如果我选择“3”然后选择“5”,它应该只显示从 1 到 5 而不是从 1 到 8 的排列。它应该插入行而不会丢失写入的数据之前。

@Tom 的代码:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim i As Long
Dim StartingRow As Long
Dim StartingArrangement As Long

If Not Intersect(Target, Me.Cells(1, 2)) Is Nothing Then
    With Me
        StartingRow = .Cells(.Rows.Count, 1).End(xlUp).Row

        If StartingRow < 3 Then
            StartingRow = 2
        Else
            StartingArrangement = CLng(Trim(Replace(Replace(.Cells(StartingRow, 1), "Arrangement ", vbNullString), ":", vbNullString)))
        End If

        For i = 1 To .Cells(1, 2).Value2
            .Cells(StartingRow, 1).Offset(i, 0).Value2 = "Arrangement " & StartingArrangement + i & ":"
        Next i
    End With
End If
End Sub

有人可以帮帮我吗?对这两种语言一无所知!

【问题讨论】:

  • 你可以用谷歌脚本来做到这一点。无需 Excel
  • 在 Javascript 中?如何从单元格中获取值?
  • 我从未使用过 Google 表格,所以不知道是否可行,但我会接受 @Tom 的说法。在 VBA 中,只需使用 excel range.formula .. 即 Thisworkbook.Worksheets("Sheet1").Range("A1").Formula = "=SUM(A2:A5)"

标签: javascript vba excel google-sheets


【解决方案1】:

两者都在单元格B1 中输入并填充列A

谷歌脚本方法: 选择工具 -> 脚本编辑器 注:在 cmets 之后我没有更新 GS 脚本,因为似乎对它不感兴趣

function PopulateColumn() { 
  for (i = 1; i<=SpreadsheetApp.getActiveSheet().getRange(1,2).getValue(); i++) {
    SpreadsheetApp.getActiveSheet().getRange(i,1).setValue('Arrangement ' + i + ':')
  }
}

VBA 方法:在左侧“Microsoft Excel 对象”下方的 VBA 编辑器中,您将找到工作表对象。将此粘贴到您希望它填充的工作表中

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim i As Long
    Dim StartingRow As Long
    Dim StartingArrangement As Long

    If Not Intersect(Target, Me.Cells(1, 2)) Is Nothing Then
        With Me
            StartingRow = .Cells(.Rows.Count, 1).End(xlUp).Row

            If StartingRow < 3 Then
                StartingRow = 2
            Else
                StartingArrangement = CLng(Trim(Replace(Replace(.Cells(StartingRow, 1), "Arrangement ", vbNullString), ":", vbNullString)))
            End If

            For i = 1 To .Cells(1, 2).Value2
                .Cells(StartingRow, 1).Offset(i, 0).Value2 = "Arrangement " & StartingArrangement + i & ":"
            Next i
        End With
    End If
End Sub

【讨论】:

  • VBA:感谢您的帮助,但我不想在单元格上书写时覆盖数据。如何插入行?我可以在选择数字后立即运行代码,而不是每次都在编辑器上单击“运行”吗? GS:说它无法从未定义(第 2 行)读取“范围”
  • 我已对其进行了更新以删除事件。当你尝试调试一个事件时,GS 会说
  • JS:谢谢,但是会覆盖单元格上的数据,如何插入行而不是覆盖那些单元格上写入的数据?
  • VBA:不明白你说的进入工作表对象是什么意思...我应该在 VBA 编辑器中做什么?我从来没有用过这个,抱歉这么烦人!
  • 忽略用于事件驱动基础的那个位。将代码粘贴到模块中(您可能必须插入一个),然后单击运行