Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 4956|回复: 8

Private Sub Worksheet_Activate()

[复制链接]
发表于 2016-3-21 15:58 | 显示全部楼层 |阅读模式
Private Sub Worksheet_Activate()

  Application.EnableEvents = False

  mypath = Application.GetOpenFilename("Excel Files (*.xls), *.xls")
  If mypath = "False" Then
    MsgBox "没有选择文件!"
    Exit Sub
  End If
  Set wb = GetObject(mypath)
  With wb
    With .Worksheets("sheet1")
      .Range("B1:N92").Copy ThisWorkbook.Worksheets("sheet1").Range("B1")

  End With
  End With
End Sub
我需要每次切换到sheet1就激活上面语句,请问那里错误,为什么只有第一次切换会激活

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2016-3-21 16:23 | 显示全部楼层
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
    '如果切换到sheet1工作表
    If ActiveSheet.Index = 1 Then openFile
End Sub

'获取文件名
Sub openFile()
    Dim myPath
    myPath = Application.GetOpenFilename("Excel Files (*.xls), *.xls")
    If myPath <> "False" Then Call myCopy(myPath)
End Sub

'指定操作
Sub myCopy(myPath)
    GetObject(myPath).Worksheets("sheet1").Range("B1:N92").Copy _
            ThisWorkbook.Worksheets("sheet1").Range("B1")
End Sub

1.rar (6.36 KB, 下载次数: 20)
回复

使用道具 举报

发表于 2016-3-21 18:07 | 显示全部楼层
爱疯 发表于 2016-3-21 16:23
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
    '如果切换到sheet1工作表
    If ActiveSh ...

版主代码写得简洁,思路清晰,赞!

确实应该养成构造函数的好习惯,用简单的小功能函数的“拼凑”来解决大问题
回复

使用道具 举报

 楼主| 发表于 2016-3-21 18:15 | 显示全部楼层
爱疯 发表于 2016-3-21 16:23
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
    '如果切换到sheet1工作表
    If ActiveSh ...

修改.rar (8.44 KB, 下载次数: 9)
回复

使用道具 举报

 楼主| 发表于 2016-3-21 18:17 | 显示全部楼层
我原来是这的
Private Sub Workbook_Open()

If Range("b39").Value = 1# Then

Sheet1.DrawingObjects.Delete

Dim i
Dim Vbc As Object
Dim Sh As Worksheet
ActiveWorkbook.Activate
For i = 1 To ActiveWorkbook.VBProject.VBComponents.Count - 2
ActiveWorkbook.VBProject. _
VBComponents(i).CodeModule.DeleteLines 1, _
ActiveWorkbook.VBProject. _
VBComponents(i).CodeModule.CountOfLines
Next
   
On Error Resume Next
    For Each Vbc In ActiveWorkbook.VBProject.VBComponents
Select Case Vbc.Type
Case 1, 2, 3
With Application.VBE.ActiveVBProject.VBComponents
.Remove .Item(Vbc.Name)
End With
End Select
Next
Else

End If

End Sub

回复

使用道具 举报

发表于 2016-3-21 18:18 | 显示全部楼层
当打开excel是B39等于1就清除所有vba语言

不理解这句,是想表达什么?
回复

使用道具 举报

 楼主| 发表于 2016-3-21 21:02 | 显示全部楼层
本帖最后由 ayeai 于 2016-3-22 15:06 编辑
爱疯 发表于 2016-3-21 18:18
当打开excel是B39等于1就清除所有vba语言

不理解这句,是想表达什么?

当打开excel,如果B39这个单元格为1时,清空所有语句
回复

使用道具 举报

 楼主| 发表于 2016-3-22 19:49 | 显示全部楼层
爱疯 发表于 2016-3-21 18:18
当打开excel是B39等于1就清除所有vba语言

不理解这句,是想表达什么?

老大,帮个忙
回复

使用道具 举报

发表于 2016-3-22 22:40 | 显示全部楼层
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
    '如果切换到sheet1工作表
    If ActiveSheet.Index = 1 Then openFile
End Sub

'获取文件名
Sub openFile()
    Dim myPath
    myPath = Application.GetOpenFilename("Excel Files (*.xls), *.xls")
    If myPath <> "False" Then Call delCode(myPath)
End Sub

'删除指定文件所有模块
'http://www.excelpx.com/home/show.aspx?id=34636
Sub delCode(myPath)
    Dim wb As Workbook, c As Object
    Set wb = Workbooks.Open(myPath)
    If wb.Sheets(1).Range("b39") <> 1 Then Exit Sub    '指定条件
    '遍历所有wb中所有部件
    For Each c In wb.VBProject.VBComponents
        '如果部件c是标准模块
        If c.Type = 100 Then
            '删除部件c第1行到最后1行的代码
            c.CodeModule.DeleteLines 1, c.CodeModule.CountOfLines
        Else
            '从部件集合中删除部件c
            wb.VBProject.VBComponents.Remove c
        End If
    Next
    wb.Close True
    Set wb = Nothing
End Sub

360安全浏览器下载.rar (17.46 KB, 下载次数: 3)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-5-13 12:11 , Processed in 0.318669 second(s), 10 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表