通过“旋转”按钮启动不同的工作表

时间:2013-08-27 13:21:06

标签: excel vba spinner

想要使用“旋转”按钮(ActiveX控件)来显示上一张或下一张。单击该按钮时,事件成功触发并激活所需的工作表,但它保留了原始工作表中的一些元素(命令,图形等),并将这些元素显示为附加图片。

wrongly loaded sheet initial sheet with Spin buttons (right) 向下按钮事件的示例代码:

Private Sub SpinButton_JumpToWeek_SpinDown()

Dim sh_num As String
Dim tmp_num As Integer

  Application.ScreenUpdating = False
  Application.EnableEvents = False

  SpinButton_JumpToWeek.Value = Range("B27").Value - 1
  tmp_num = SpinButton_JumpToWeek.Value

   ' Activate desired KTx sheet
  sh_num = "KT" & tmp_num

  Range("F27").Value = ""   'reset to blank

  Sheets(sh_num).Activate

  Application.ScreenUpdating = True
  Application.EnableEvents = True

End Sub

要覆盖此效果,我必须手动选择(激活)另一张纸,然后再次选择所需的纸张。我还尝试使用宏自动化此变通方法,但不幸的是它不起作用。

有趣的是,如果我在调试模式下执行代码(使用断点和逐行步进),则不会出现此问题。

令人惊讶的是,如果我尝试通过将值(工作表名称索引)写入定义的单元格(即使用Worksheet_Change事件)来显示上一页/下一页,我没有这样的问题。正确显示所需的页面。见照片。

enter image description here

此偶数图像描述的示例代码:

Private Sub Worksheet_Change(ByVal Target As Range)

Dim sh_num As String

  Application.ScreenUpdating = False
  Application.EnableEvents = False

  If Range("F27").Value > 0 Then
 ' Activate desired KTx sheet
   sh_num = "KT" & Range("F27").Value
   Range("F27").Value = ""   'reset to blank

   Sheets(sh_num).Activate
  End If


  Application.ScreenUpdating = True
  Application.EnableEvents = True

End Sub

我需要使用Spin按钮,因为它更快,并允许我跳过一些工作表(例如,如果这些没有数据)。 在32位和64位Excel中都会出现此问题。

有人知道为什么会出现这个问题并找到解决方法吗?我是否必须在Excel中更改某些设置或系统属性?任何帮助都将受到高度赞赏。

@mehow 由于词汇很多,我在这里追加我的恭喜。

  1. 我按照你的建议尝试了插入主动控件“Microsoft Office Spreadsheet”的UserForm示例。我发现这对我的情况来说不是一个好的解决方案,因为当用户将值插入单元格时,这种表单的响应相对较慢(即使在像我这样的快速PC上)。此外,这将使我相当简单的* .xlsm工作簿变得非常复杂,该工作簿有超过50张(每周1张,这些纸张的内容然后链接到主页),完全符合我的基本必需品(与当然这个旋转按钮例外。)
  2. 在我看来,可能需要操纵某种系统属性(例如Application.ScreenUpdating技巧),但我没有足够的VBA知识来查找它。

    1. 为了清楚地解释我的问题,我需要分享我的示例工作簿,但我不知道如何将其上传到此论坛。不幸的是,我无法在此论坛上成功上传/显示图片(由于我的评分很低),这也会有很大的帮助。
    2. 顺便说一句,我也看不到本论坛其他问题的图像。 。由于Web浏览器中缺少插件,是否会出现此问题?

1 个答案:

答案 0 :(得分:1)

你可以使用一个简单的技巧......在“Application.screenupdating = true”之前你可以插入两行:

ActiveWindow.SmallScroll Down:=-100
ActiveWindow.SmallScroll Up:=100