• Excel VBA 开发过程中遇到的一些问题,解决方案,持续更新


    Excel FAQ


    FAQ1

    1.若要在64位系统上使用,则必须更新此项目中的代码。请检查并更新Declare语句,然后用PtrSafe属性标记他们

    在→Declare后
    添加 →PtrSafe
    即用PtrSafe标记Declare
    
    • 1
    • 2
    • 3

    2.当选择窗体模式后,工作簿文件打开却无法操作,如何解决?

    假设窗体为Demo1
    进入窗体:

    Application.Visible = False
    Application.DisplayAlerts = False
    Application.ScreenUpdating = False
    Demo1.Show
    
    • 1
    • 2
    • 3
    • 4

    显示工作簿:

    Application.Visible = True
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
    
    • 1
    • 2
    • 3

    上述会遇到的问是:打开了工作簿却无法对工作簿进行任何操作,因为焦点一直处在窗口中
    解决办法:

    Demo1.Show vbModeless
    
    • 1

    3.VB中 ME该如何理解?

    代码所在的对象,如果是工作表代码就代表该工作表,如果是窗体代码就代表窗体
    如果你的代码写在worksheets之下,则me代表这个工作表;
    如果代码写在workbook里面则me代表thisworkbook,;
    如果代码写在自定义窗体下,则me代表这个窗体。
    例如:

    Private Sub UserForm_Initialize()
        Me.OptionButton1.Value = True
        Me.OptionButton5.Value = True
        Me.OptionButton8.Value = True
    End Sub
    
    • 1
    • 2
    • 3
    • 4
    • 5

    4.ListView用法

    Sub initListView()
         With ListView1                           '初始化listview
            .ColumnHeaders.Add , , "COUNTIF", 45, lvwColumnLeft
            .ColumnHeaders.Add , , "助力曲线", 45, lvwColumnLeft
            .ColumnHeaders.Add , , "主动回正1", 50, lvwColumnCenter
            .ColumnHeaders.Add , , "主动回正2", 50, lvwColumnCenter
            .ColumnHeaders.Add , , "阻尼补偿", 45, lvwColumnCenter
            .ColumnHeaders.Add , , "高频增益", 45, lvwColumnCenter
            .ColumnHeaders.Add , , "滤波器", 40, lvwColumnCenter
            .ColumnHeaders.Add , , "软止点", 40, lvwColumnCenter
            .ColumnHeaders.Add , , "轮速", 40, lvwColumnCenter
            .ColumnHeaders.Add , , "稳定滤波器", 60, lvwColumnCenter
            .ColumnHeaders.Add , , "转矩阻尼", 45, lvwColumnCenter
            .ColumnHeaders.Add , , "电机控制", 48, lvwColumnCenter
            .View = lvwReport                                    '以报表的格式显示
            .LabelEdit = lvwManual                               '使内容不可编辑
            .FullRowSelect = True                                '允许整行选中
            .Gridlines = True                                    '显示网格线
            .Sorted = True                                       '排序
        End With
    End Sub
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    5.Excel工作簿出现“此工作簿包含一个或多个可能不安全的外部源的链接”,请问怎么取消这烦人的提示?

    首先出现该现象的原因可能是:复制工作表的时候顺带把所带宏的连接也复制了过来,连接到了另一个工作簿
    数据->编辑连接 可以看到所链接的外部文件,那么如何断开呢?
    将带有链接的宏删除点,然后再次打开编辑链接,可以看到断开链接可用。
    打开EXCEL,依次打开“数据”选项卡——“连接”组——“编辑连接”——启动提示——不显示该警告,但是更新链接(O)

    6.在开发窗口过程中遇到了一个现象:当我打开Excel表格后,表格正常进入窗口,通过右上角关闭按钮关闭后,下次打开表格会直接进入表格,而不是进入窗口。如何解决?

    其实在点击右上角关闭按钮后,只是单纯的关闭了窗口,此时表格在后台运行,只是不在界面上而已,当你再次打开后会发现直接把表格文件调了出来,那么解决的办法是:重载关闭按钮函数
    1.重载-增加退出选项,不能解决问题描述

    Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
       Dim Msg As String
       Msg = MsgBox("È·¶¨ÒªÍ˳öÂð?", vbQuestion + vbOKCancel, "Ìáʾ")
       If Msg = vbCancel Then Cancel = True
       'If CloseMode <> 1 Then Cancel = True
    End Sub
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2.重载-屏蔽关闭按钮,能够解决上述问题,关闭按钮完全被屏蔽(无法退出)

    Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
     	 If CloseMode <> 1 Then Cancel = True
    End Sub
    
    • 1
    • 2
    • 3

    3.搭配-新建函数来实现关闭、退出选项

    ThisWorkbook.Close
    
    • 1

    4.完全屏蔽X按钮(因为我的是x64,所以API声明上我直接加了PtrSafe)

    Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Private Declare PtrSafe Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
    Private Declare PtrSafe Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Private Const GWL_STYLE = (-16)
    Private Const WS_SYSMENU = &H80000
    
    Private Sub UserForm_Initialize()
        Dim hWnd As Long, lStyle As Long
        hWnd = FindWindow(vbNullString, Me.Caption)
        lStyle = GetWindowLong(hWnd, GWL_STYLE)
        SetWindowLong hWnd, GWL_STYLE, lStyle And Not WS_SYSMENU
    End Sub
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    FAQ2

    窗体显示textbox控件无法正常显示小数

    textbox1= sheets(“sheet1”).range(“a1”).text

    FAQ3

    vba:有没有能够把textbox.text里面的内容强制转换为数字类型

    Dim i As Integer
    If IsNumeric(textbox.txt) Then
    i=val(textbox.text)
    end if

    sheets(“sheet1”).range(“a1”).value = val(textbox.text) 但首先要保证是数字

    FAQ4

    使用Excel+VBA对网页进行操作

    With CreateObject("internetexplorer.application")
        .Visible = True
        .Navigate "https://www.baidu.com/s?wd=扯乎"
        '关闭网页
        '.Quit
    End With
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    FAQ5

    VBA打开文件选择框、取得文件全路径与文件名

    'VBA打开文件选择框、取得文件全路径与文件名
    Sub selectExcelfile()
        Dim fileNameObj As Variant
        Dim aFile As Variant                            '数组,提取文件名fileName时使用
    
         '打开文件对话框返回的文件名,是一个全路径文件名,其值也可能是False,因此类型为Variant
        Dim fullName As String
        Dim fileName As String                         '从FileName中提取的路径名
    
        Dim i As Integer
    
        fileNameObj = Application.GetOpenFilename("Excel 文件 (*.xls),*.xls")
        '调用Windows打开文件对话框
        If fileNameObj <> False Then                       '如果未按“取消”键
            aFile = Split(fileNameObj, "\")
    
            fileName = aFile(UBound(aFile))            '数组的最后一个元素为文件名
            fullName = aFile(0)
            For i = 1 To UBound(aFile)                 '循环合成全路径
                fullName = fullName & "\" & aFile(i)
            Next
    
        Else
            MsgBox "请选择文件"
            End
        End If
        '得到Excel全路径
        allExcelFullPath = fullName
        '得到Excel文件名
        workbookName = fileName
    End Sub
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    FAQ6

    • 得到A列的最后一个非空单元格:iRow=range("a65536").end(xlup).row

    • 第一列的行数 col = Application.WorksheetFunction.CountA(Columns(1))

    FAQ7

    QueryTables.Add(Connection后面是文件名怎样使用变量?

    试了以下代码,出错。 fileToOpen = Application.GetOpenFilename("Text Files (*.txt), *.txt") ActiveSheet.QueryTables.Add(Connection:="TEXT;fileToOpen", Destination:=Range("A1"))

    解答:

    Connection:="TEXT;" & fileToOpen,

    FAQ8

    窗体程序运行完成后如何自动关闭,不占用内存?

    窗体内有代码,我想实现的功能是当这些代码运行完后,这个窗体自动关闭,这个代码是什么?

    • Me.Hide
    • unload me
  • 相关阅读:
    TCP缓存
    河北首家城商行传统核心业务国产化,TDSQL突破三“最”为秦皇岛银行保驾护航
    推荐系统常用知识点
    MYSQL——外键约束
    STM32将FreeRTOS移植到用CubeMX生成的HAL库中
    lv19 多态 4
    如何使用python将hadoop中的数据保存到数据库中
    全栈性能测试教程之性能测试相关知识(二) Jmeter的应用
    LeetCode(17)罗马数字转整数【数组/字符串】【简单】
    Android热修复Sophix的使用
  • 原文地址:https://blog.csdn.net/qq_33704787/article/details/126025793