勤勉敦敏 2024-06-10 19:18 采纳率: 83.3%
浏览 4
已结题

excel的vba作用域的问题

打开多个同名的sheet的excel文件时用代码移动多行,会从后打开的excel里移动到先打开的excel相同sheet工作簿里。

Sub MoveRows()
    Dim wsSource As Worksheet
    Dim wsDestination As Worksheet
    Dim rng As Range
    
    ' 获取当前激活的工作表
    Set wsSource = ActiveSheet
    
    ' 根据当前激活的工作表名称设置目标工作表
    If wsSource.Name = "备选" Then
        Set wsDestination = ThisWorkbook.Sheets("选中")
    ElseIf wsSource.Name = "选中" Then
        Set wsDestination = ThisWorkbook.Sheets("备选")
    Else
        MsgBox "当前工作表不是 '备选' 或 '选中'。", vbExclamation
        Exit Sub
    End If
    
    ' 获取当前选中的范围
    Set rng = Selection
    
    ' 复制选中的行到目标工作表的尾部
    rng.EntireRow.Copy Destination:=wsDestination.Cells(wsDestination.Rows.Count, 1).End(xlUp).Offset(1, 0)
    
    ' 删除源工作表中的选中行
    rng.EntireRow.Delete
End Sub

觉得这是打开的excel作用域都在一起吗?
请问怎样解决?

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-10 19:18
    关注

    引自免费微信小程序:皆我百晓生

    遇到在不同Excel文件间操作VBA作用域的问题,确实容易让人困惑。问题在于VBA默认对活动对象(如活动工作簿、活动工作表)的操作,这可能会导致在多个Excel文件同时打开时,代码执行的对象不明确,特别是当这些文件有同名的工作表时。

    为了解决这个问题,可以采取以下策略:

    1. 显式指定工作簿对象:确保在代码中明确指出要操作的具体工作簿,而不是依赖于活动工作簿。

    2. 使用变量存储工作簿对象:在代码开始时,将所有相关工作簿存储为变量,这样在后续操作中就可以直接引用这些变量,而不会受到活动工作簿的影响。

    3. 使用路径和文件名完全限定工作簿:通过提供完整路径和文件名来打开和引用工作簿,这样可以避免混淆。

    根据以上策略,下面是一个修改后的示例代码,它解决了你在多个Excel文件间移动行的问题:

    Sub MoveRowsBetweenWorkbooks()
        Dim wbSource As Workbook, wbDestination As Workbook
        Dim wsSource As Worksheet, wsDestination As Worksheet
        Dim rng As Range
        
        ' 指定源工作簿和目标工作簿的路径及文件名
        ' 注意:这里需要替换为实际的文件路径和文件名
        Dim strSourcePath As String: strSourcePath = "C:\path\to\source.xlsx"
        Dim strDestinationPath As String: strDestinationPath = "C:\path\to\destination.xlsx"
        
        ' 打开源工作簿和目标工作簿
        Set wbSource = Workbooks.Open(strSourcePath)
        Set wbDestination = Workbooks.Open(strDestinationPath)
        
        ' 设置工作表
        Set wsSource = wbSource.Sheets("备选") ' 或者是 wsSource = wbSource.Sheets("选中")
        Set wsDestination = wbDestination.Sheets("选中") ' 或者是 wsDestination = wbDestination.Sheets("备选")
        
        ' 获取选中的范围
        Set rng = wsSource.Range("A1").CurrentRegion ' 假设是在A1开始的区域被选中,可以根据实际情况调整
    
        ' 复制选中的行到目标工作表的尾部
        rng.EntireRow.Copy Destination:=wsDestination.Cells(wsDestination.Rows.Count, 1).End(xlUp).Offset(1, 0)
        
        ' 删除源工作表中的选中行
        wsSource.Cells(wsSource.Rows.Count, 1).End(xlUp).Resize(rng.Rows.Count).EntireRow.Delete
        
        ' 关闭工作簿,保存或不保存取决于具体需求
        wbSource.Close SaveChanges:=False
        wbDestination.Close SaveChanges:=True
    End Sub
    

    注意:

    • 在上述代码中,wbSource.Close SaveChanges:=FalsewbDestination.Close SaveChanges:=True 这两行用于关闭工作簿,SaveChanges 参数控制是否保存更改。根据你的需求调整这些参数。
    • 确保在运行代码前替换strSourcePathstrDestinationPath 变量中的路径和文件名为实际的文件位置。
    • 如果源工作簿和目标工作簿在代码执行过程中已经打开,可以省略Workbooks.Open 调用,并直接使用Set语句指向已经打开的工作簿实例。

    这个修改后的代码应该能更准确地处理在多个Excel文件间的行移动操作,避免了因作用域不清带来的问题。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 6月20日
  • 已采纳回答 6月12日
  • 创建了问题 6月10日

悬赏问题

  • ¥15 远程访问linux主机超时
  • ¥15 odoo17存货管理优势于中国国内该行业传统ERP或MES的详细解读和举例
  • ¥15 CPU卡指令整合指令数据都在图片上
  • ¥15 火车票关联12306问题
  • ¥15 odoo17处理受托加工产品
  • ¥15 如何用MATLAB编码图三的积分
  • ¥15 圆孔衍射光强随孔径变化
  • ¥15 MacBook pro m3max上用vscode运行c语言没有反应
  • ¥15 ESP-PROG配置错误,ALL ONES
  • ¥15 结构功能耦合指标计算