You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Excel VBA提取成绩表数据至数组并写入Sheet2无结果问题求助

问题分析与修复方案

你的代码没报错但没得到预期结果,核心问题是未明确指定工作表的单元格引用,加上一些可优化的细节:

核心问题点

  • 读取数据时,Cells(r, c).Value默认指向当前激活的工作表,而非目标的Sheet1,导致读入数组的可能是错误数据甚至空值。
  • 变量lrow和lc用了Integer类型,Excel行数超过32767时会溢出,应该改用Long类型。
  • 写入数据时用Select切换工作表不够可靠,直接指定工作表引用更稳定。

修复后的代码(保留原循环逻辑)

Private Sub CommandButton1_Click()
    Dim myarr() As String
    Dim lrow As Long, lc As Long, r As Long, c As Long
    
    ' 明确指定Sheet1获取行列数
    lrow = Sheets("Sheet1").Range("A" & Sheets("Sheet1").Rows.Count).End(xlUp).Row
    lc = Sheets("Sheet1").Range("A1").End(xlToRight).Column
    
    ' 调整数组下界为1,和循环起始值匹配(更直观)
    ReDim myarr(1 To lrow, 1 To lc) As String
    
    ' 读取Sheet1数据到数组,明确指定工作表
    For r = 1 To lrow
        For c = 1 To lc
            myarr(r, c) = Sheets("Sheet1").Cells(r, c).Value
        Next c
    Next r
    
    ' 写入Sheet2,直接指定工作表,无需Select
    For r = 1 To lrow
        For c = 1 To lc
            Sheets("Sheet2").Cells(r, c) = myarr(r, c)
        Next c
    Next r
End Sub

更高效的优化版本(无需双重循环)

VBA支持直接将单元格区域赋值给Variant数组,再批量写入目标区域,效率比循环高得多:

Private Sub CommandButton1_Click()
    Dim sourceRange As Range
    Dim targetRange As Range
    Dim dataArr As Variant
    
    ' 获取Sheet1的完整数据源区域
    With Sheets("Sheet1")
        Set sourceRange = .Range("A1:" & .Cells(.Rows.Count, "A").End(xlUp).Address _
            & ":" & .Cells(1, .Columns.Count).End(xlToLeft).Address)
    End With
    
    ' 直接将区域数据存入数组
    dataArr = sourceRange.Value
    
    ' 获取Sheet2的目标区域,大小与数据源一致
    Set targetRange = Sheets("Sheet2").Range("A1").Resize(UBound(dataArr, 1), UBound(dataArr, 2))
    
    ' 批量写入数据
    targetRange.Value = dataArr
End Sub

内容的提问来源于stack exchange,提问作者Swarnadip Bandyopadhyay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 09:15:33