VBA代码(珍藏



'**关闭屏幕刷新
  Application.ScreenUpdating = False

 


 '**取消删除工作表警告提示
  Application.DisplayAlerts = False
 


  '**引用打开窗口

  Dim fd As FileDialog

  Dim vrtSelectedItem As Variant

 

  Set fd = Application.FileDialog(msoFileDialogOpen)

  fd.InitialFileName = Sheets("设置").Range("CU7").Value & "\库存核对" '默认打开的文件夹

  With fd
    .AllowMultiSelect = True '可选多个文件
    If .Show = -1 Then
      For Each vrtSelectedItem In .SelectedItems
        FJ = Split(vrtSelectedItem, "\")
        ThisWorkbook.Sheets("设置").Range(CR).Value = FJ(3) '记录文件名
        ThisWorkbook.Sheets("设置").Range("AG1").Value = FJ(3) '记录文件名
        fd.Execute '执行打开
        Me.CommandButton62.Enabled = True
        Exit For
      Next
    End If
  End With
  Set fd = Nothing


****得到计算机名称
  Environ("Computername")


  ****判断是不是数字

  If IsNumeric(InputBox("Please Input:")) Then


  ****筛选非空单元格

  ActiveSheet.Range("$E$7:$I$15").AutoFilter Field:=1, Criteria1:="<>"


  ****仅贴值

    Range("F5:J25").Select
    Selection.Copy
    Range("E5").Select
    ActiveSheet.PasteSpecial Format:=3, Link:=1, DisplayAsIcon:=False, _
        IconFileName:=False


 

  ****设置是否冻结空格
  ActiveWindow.FreezePanes = False
  ActiveWindow.FreezePanes = True


 

  ****设置页面
  With ActiveSheet.PageSetup
    .LeftFooter = "编制:                  审核:" '页脚LEFT
    .PrintTitleRows = "$1:$3" '要打印的默认页头
    .PrintArea = "$A$1:$E$12" '打印区域
  End With
 .PrintOut Copies:=2 '打印(2份)


  ****设置批注

    Range("F8").AddComment'添加批注

    Range("F8").Comment.Visible = False'隐藏框

    .Comment.Shape.TextFrame.AutoSize = True'自动调整框大小

    .Comment.Font.FontStyle = "常规"   '将字体设置为“常规”(不加粗)(不成功)

     '-------------------------------------
    Range("F8").Comment.Text Text:="黄传兵:" & Chr(10) & "SS"

    If Range("F8").Comment Is Nothing Then '如果没有批注内容


 

Public Function OPEN_JL(WJ As String)  '检测是否有相应引用文件的打开记录
  Dim I As Integer
  Dim MC, MC_CR As String
 
  L3 = ThisWorkbook.Sheets("设置").Range("N2").Value
  For I = 4 To L3 + 3
    MC_CR = "N" & I
    MC = ThisWorkbook.Sheets("设置").Range(MC_CR).Value
    If UCase(MC) = UCase(WJ) Then
      OPEN_JL = "Y"
      Exit For
    End If
  Next I
End Function


 '打开需引用的文件

Public Sub OPEN_WJ(LJ, WJ As String)On Error GoTo X:
  Dim M4, Y3 As String
  Dim LJWJ As String
 
  LJWJ = LJ & WJ
  If OPEN_YN(WJ) <> "Y" Then '如果未被其它引用并打开
    Workbooks.Open Filename:=LJWJ
    L3 = ThisWorkbook.Sheets("设置").Range("N2").Value
    M3_CR = "N" & L3 + 4
    M4_CR = "O" & L3 + 4
    ThisWorkbook.Sheets("设置").Range(M3_CR).Value = WJ
    ThisWorkbook.Sheets("设置").Range(M4_CR).Value = 1
    Windows(WJ).Visible = False

  Else '如果已被其它引用并打开
    If OPEN_JL(WJ) = "" Then
      L3 = ThisWorkbook.Sheets("设置").Range("N2").Value
      M3_CR = "N" & L3 + 4
      M4_CR = "O" & L3 + 4
      ThisWorkbook.Sheets("设置").Range(M3_CR).Value = WJ
      ThisWorkbook.Sheets("设置").Range(M4_CR).Value = 2
    End If
  End If
 
  Exit Sub
X:
  MsgBox """ & WJ & ""未打开,请检查路径。"

End Sub


'检测文件是否已经打开

Public Function OPEN_YN(WJ As String)    Dim X As Workbook
 
  For Each X In Application.Workbooks
    If UCase(CStr(X.Name)) = UCase(WJ) Then
      OPEN_YN = "Y"
      Exit For
    End If
  Next
End Function


'关闭引用文件

Public Sub CLOSE_YY() On Error Resume Next
  Dim I, L As Integer
  Dim MC, MC_CR, ZT, ZT_CR As String
 
  L = ThisWorkbook.Sheets("设置").Range("N2").Value
  For I = L + 3 To 4 Step -1
    MC_CR = "O" & I
    ZT_CR = "P" & I
    MC = ThisWorkbook.Sheets("设置").Range(MC_CR).Value
    ZT = ThisWorkbook.Sheets("设置").Range(ZT_CR).Value
    If MC <> "" Then
      If Workbooks(MC).Saved = False Then Workbooks(MC).Save
      If ZT = 1 Then Workbooks(MC).Close '如果是本文件引用并打开的则关闭
      ThisWorkbook.Sheets("设置").Range(MC_CR).Value = ""
      ThisWorkbook.Sheets("设置").Range(ZT_CR).Value = ""
    End If
  Next I
End Sub


***设置控件变量

Dim LB As MSForms.Label

Set LB = SYS.Controls("LB" & I + 1)


 

***只读方式打开、关闭时不保存
, ReadOnly:=True
, SaveChanges:=False


 

文本框输入限制处理-
  TextBox1.MaxLength = 5 '最大允许输入的字符长度5
  TextBox1.AutoTab = True '当达到最大允许输入的字符长度是,自动跳格


 

***得到文件扩展名
  Right(ActiveWorkbook.Name, Len(ActiveWorkbook.Name) _
             - InStr(ActiveWorkbook.Name, ".") + 1)


 

***得到指定字符出现的位置,并替换字串中指定的字符
  Z = Me.TextBox37.Value
  LS = InStr(1, Z, "(")
  RS = InStr(1, Z, ")")
  Replace(Z, Mid(Z, LS + 1, RS - LS - 1), Sheets("设置").Range("J1").Value)


***单元格背景、前景设置
  .Cells(R + 1, C).Interior.Color = 255'背景红
  .Cells(R + 1, C).Font.ThemeColor = xlThemeColorDark1 '前景白

  .Cells(R + 1, C).Interior.Pattern = xlNone'背景无
  .Cells(R + 1, C).Font.ColorIndex = xlAutomatic'前景黑(默认)


 ***当前单元格的行、列号

  Selection.Row

  Selection.Column


***当关闭文件时自动备份----------------------------------
      Dim NEW_NAME As String
      NEW_NAME = Year(Date) & Month(Date)
      NEW_NAME = "\\Ck2\公司平台 (e)\仓库备份勿删\月度进销存" & NEW_NAME & ".xlsm"
      Me.SaveAs Filename:=NEW_NAME, FileFormat:=xlOpenXMLWorkbookMacroEnabled,          CreateBackup:=False

***处理单元格批注
   'U_NAME是修改人的名字
   WITH RANGE(CR)
        If .Comment Is Nothing Then
          .AddComment
          .Comment.Visible = False
          .Comment.Text Text:=U_NAME & ":" & Chr(10) & "原" & Z & "," & Date & GG
        Else
          .Comment.Text Text:=.Comment.Text & Chr(10) & U_NAME & ":" & Chr(10) & "原" & Z & "," & Date & GG
        End If
   END WITH


Public Function HOW_CS(STR1 As String, STR2 As String)  '得到 STR2 在 STR1 中出现的次数

  Dim I As Integer

  Dim B As String

  '黄传兵定稿的2008-12-17

  B = STR1

  If InStr(B, STR2) = 0 Then

    I = 0

  Else

    For I = 1 To 50

      B = Replace(B, Left(B, InStr(B, STR2)), "", 1, 1)

      If Len(B) = 0 Or InStr(B, STR2) = 0 Then

        Exit For

      End If

    Next I

  End If

  HOW_CS = I

End Function


用API切换打印机
Application.Dialogs(xlDialogPrinterSetup).Show
Application.ActivePrinter'当前打印机


 '隐藏列
Columns(I + J).EntireColumn.Hidden = True  '隐藏列


 '隐藏行
Rows(I).EntireRow.Hidden =True


'隐藏表
Sheets("表1").Visible = False


'为Image控件添加图片
Me.Image1.Picture = LoadPicture("E:\跟踪卡管理系统\跟踪卡日志\CT1.jpg")


Sub OUT_JPG() '将图表另存为JPG
  Dim shap As Shape
  Dim i As Integer

  With ThisWorkbook.Sheets("1")
    For i = 1 To .Shapes.Count
        Set shap = .Shapes(i)
        shap.Copy
      With .ChartObjects.Add(0, 0, shap.Width, shap.Height).Chart
        .Paste
        .Export "d:\" & i & ".jpg"
        .Parent.Delete
      End With
    Next i
  End With
End Sub


  '动态添加控件
    Set Mycmd = Controls.Add("MsForms.CommandButton.1") ', CommandButton2,Visible)
    Mycmd.Left = 18
    Mycmd.Top = 150
    Mycmd.Width = 175
    Mycmd.Height = 20
    Mycmd.Caption = "非常有趣。" & Mycmd.Name


  '数字转换为中文大写(A1单元格)公式
=IF(A1<0,"(金额为负无效)",IF((A1-INT(A1))=0,"(人民币)"&TEXT(A1,"[DBNUM2]")&"元整",IF(INT(A1*10)-A1*10=0,"(人民币)"&TEXT(INT(A1),"[DBNUM2]")&"元"&TEXT((INT(A1*10)-INT(A1)*10),"[DBNUM2]")&"角整",TEXT(INT(A1),"[DBNUM2]")&"元"&IF(INT(A1*10)-INT(A1)*10=0,"零",TEXT(INT(A1*10)-INT(A1)*10,"[DBNUM2]")&"角")&TEXT(RIGHT(A1,1),"[DBNUM2]")&"分")))


UCase 函数

返回 Variant (String),其中包含转成大写的字符串。

 

语法

UCase(string)

必要的 string 参数为任何有效的字符串表达式。如果 string 包含 Null,将返回 Null。

 

说明

只有小写的字母会转成大写;原本大写或非字母之字符保持不变。


小写

 Sub test1()                                                             '设置TEST为过程的名称

 

Dim x As Integer                                                     '声明X为整数变量

Range("A65536").End(xlUp).Row       '设置X的范围为1到A列最后空白单元格的行数

 Range("A" & x) = LCase(Range("A" & x))               '附值单元格Ax的格式全部转换为小写,如果是UCase,则转换成大写

 Next x                                                                      '循环X

 

End Sub                                                                  '结束过程

 


 '复制单元格并改名
  Sheets("Sheet1").Copy Before:=/After:=Sheets(2)
  Sheets("Sheet1 (4)").Name = "1"


Public Sub QHHZ(TXT As MSForms.TextBox, GJZ, DTHZ As String)

'将指定文本框中指定的文字块(可多选,用“,”分隔)替换为特定的文字(文本框名,要替换的字,被替换的字)

  Dim I As Integer

  Dim Y As String

  Dim FJ() As String

 

  With TXT

    If .Value <> "" Then

      FJ = Split(DTHZ, ",")

      Y = ""

      For I = 0 To 3

        If InStr(1, .Value, FJ(I)) <> 0 Then  '如果找到FJ(I)最先出现的位置

          Y = "Y"

          Exit For

        End If

      Next I

      If Y = "Y" Then

        .Value = Replace(.Value, FJ(I), GJZ)

      Else

        .Value = .Value & GJZ

      End If

    End If

    .SetFocus

  End With

 

End Sub


Function SheetIsExist(strExcleName As String, strSheetName As String) As Boolean

    '//判断名称的工作表是否已经在指定的Excel文件中存在

 

    Dim shtSheet As Worksheet

    

    SheetIsExist = False

    On Error GoTo lab1

    Set shtSheet = Workbooks(strExcleName).Sheets(strSheetName)

    If shtSheet Is Nothing Then

        SheetIsExist = False

    Else

        SheetIsExist = True

    End If

    

    Set shtSheet = Nothing'释放变量空间

    Exit Function

 

lab1:

    SheetIsExist = False

End Function


Replace(expression, find, replace[, start[, count[, compare]]])

函数功能:返回一个字符串,该字符串中指定的子字符串已被替换成另一子字符串,并且替换发生的次数也是指定的。

说明:

expression 必需的。字符串表达式,包含要替换的子字符串。 

find 必需的。要搜索到的子字符串。 

replace 必需的。用来替换的子字符串。 

start 可选的。在表达式中子字符串搜索的开始位置。如果忽略,假定从1开始(若不是从1开始,则之前的字符将不返回***,可用Left()解决)。 

count 可选的。子字符串进行替换的次数。如果忽略,缺省值是 –1,它表明进行所有可能的替换。 

compare 可选的。数字值,表示判别子字符串时所用的比较方式。关于其值,请参阅“设置值”部分。 

 


隐藏或显示列

ActiveSheet.Columns("AW:BE").EntireColumn.Hidden = False

 


切换控制权给系统,用于显示进度条(放置于显示进度条的代码之后)

DoEvents

 


'为单元格中指定的文字添加“下划线”

With .Cells(I, J).Characters(Start:=7, Length:=3).Font
              .Underline = xlUnderlineStyleSingle
            End With

 


'判断数据类型

TypeName(i)="Single" 就是单精度浮点数

TypeName(i)="Double" 就是双精度浮点数

TypeName(i)="String" 就是字符串

 


on error 语句的具体用法

①on error resume next 表示忽略所有错误继续执行下一语句,如果还有错就再往下

②on error goto 0 表示出现错误时不进行转向,直接中断执行 

③on error goto <标号> 表示出现错误时转到标号处执行 

 


'判断是否存在指定工作表

Dim wsh As Worksheet

For Each wsh In Worksheets

    If InStr(wsh.Name, "省") Then

        Call SUB1

    Else

        Call SUB2

    End If

Next


Private Sub TextZ_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

  '如果离开TextZ,按"回车"则转移焦点到TextX

  If KeyCode = 13 Then

    With Me.TextX

      .SetFocus

      If .Value <> "" Then

        .SelStart = 0

        .SelLength = Len(.Value)

      End If

    End With

  End If

End Sub


Private Sub ListXYZ_Click()
  '将列表框中的数据分别显示到文本框中
  With Me
    If .ListXYZ.ListIndex <> -1 Then
      .LabelId = .ListXYZ.Column(0, .ListXYZ.ListIndex)
      .TextX = .ListXYZ.Column(1, .ListXYZ.ListIndex)
      .TextY = .ListXYZ.Column(2, .ListXYZ.ListIndex)
      .TextZ = .ListXYZ.Column(3, .ListXYZ.ListIndex)
    End If
  End With
End Sub


  MsgBox ThisWorkbook.Sheets("A7").Range("B50").End(xlUp).Row
  MsgBox ThisWorkbook.Sheets("A7").Range("zz2").End(xlUp).Column

 

获得第4行最后有数据的“列号“ 的公式

  =LOOKUP(1,0/(4:4<>""),COLUMN(4:4))

获得H列最后有数据的“行号“ 的公式

=LOOKUP(1,0/(H:H<>""),ROW(H:H))


Application.Quit


定义函数的可选参数: Optional cf = False

  例子:

Public Function find_list_easy(wkbook, wksheet, maxRange As String, startColorRow, zColorRow As Integer, _
                               xy As String, Optional cf = False) As String


若想在只读文件关闭时不保存且不提示,可如下:

Private Sub Workbook_BeforeClose(Cancel As Boolean) 
  If Me.Saved = False And Not Me.ReadOnly Then
    Me.Save
  Else
    Me.Saved = True
  End If

End Sub


可以用ParamArray来传递不定参数,示例代码如下: 

Function MYCONCATE(ParamArray Args() As Variant) As String

Dim iArg As Variant

Dim tempStr As String

Dim iStep As Integer

    For Each iArg In Args

        If IsArray(iArg) Then

            If IsObject(iArg) Then

                For Each icell In iArg

                    tempStr = tempStr & CStr(icell.Text)

                Next

            Else

                For iStep = LBound(iArg) To UBound(iArg)

                    tempStr = tempStr & CStr(iArg(iStep))

                Next

            End If

        Else

            tempStr = tempStr & CStr(iArg)

        End If

    Next

    

    MYCONCATE = tempStr

End Function


获取当前单元格的值……

ActiveCell.Value,这个我忘了,汗1个

MsgBox ActiveCell.EntireColumn.Column '第几列

MsgBox ActiveCell.EntireRow.Row '第几行

 


将某列设置为“文本”或“通用”格式

    Columns("C:C").Select
    Selection.NumberFormatLocal = "@"

    Selection.NumberFormatLocal = "G/通用格式"

 


'若表中存在“筛选”,取消之

 ActiveSheet.ShowAllData

 


'“关闭”文件前自动判断是否为“只读方式”打开,若是则不提示保存,否则自动保存并关闭,适用于文件BeforeClose事件中

    With Me
        If .ReadOnly = True Then
            .Saved = True
        Else
            If .Saved = False Then
                .Save
                .Close
            End If
        End If
    End With


    Application.Calculation = xlManual'关闭自动计算公式功能(放在程序开关)

    Application.Calculation = xlAutomatic'打开自动计算公式功能(放在程序结尾)


    time1 = Time '记录开始时间

    time2 = Time '记录结束时间
    Me.Label6.Caption = "用时:" & Round((time2 - time1) * 24 * 3600, 1) & " 秒" '显示用时


‘设置整个单元格的“前景、背景色”

  If Me.CheckBox1.Value = False Then
    Cells.Interior.Color = Sheets("设置").Range("G1").Interior.Color'背景色
    Cells.Font.Color = Sheets("设置").Range("G1").Font.Color'前景色
  End If


受“筛选”影响结果的统计公式:

=SUBTOTAL(9,F7:F1000)


 

'关闭设置
    Application.ScreenUpdating = False
    Application.DisplayStatusBar = False
    Application.Calculation = xlCalculationManual
    Application.EnableEvents = False
    ActiveSheet.DisplayPageBreaks = False '注:这是工作表级的设置

 

'打开(改变的)设置
    Application.ScreenUpdating = True 'screenUpdateState
    Application.DisplayStatusBar = True 'statusBarState
    Application.Calculation = xlAutomatic 'calcState
    Application.EnableEvents = True 'eventsState
    ActiveSheet.DisplayPageBreaks = True 'displayPageBreaksState '注:这是工作表级的设置

 


'设置在边距
    With ActiveSheet.PageSetup
        .LeftMargin = Application.InchesToPoints(0.36)
        .RightMargin = Application.InchesToPoints()
        .TopMargin = Application.InchesToPoints()
        .BottomMargin = Application.InchesToPoints()
    End With


'获取鼠标坐标点:

Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long

Type POINTAPI
    X As Long
    Y As Long
End Type

Public Function getmouse_x_y() As POINTAPI
GetCursorPos getmouse_x_y

End Function



sub test()
'call getmouse_x_y '调用“获取鼠标坐标值过程”(假定你们给的过程/程序,名叫getmouse_x_y)
if getmouse_x_y.x>100 and getmouse_x_y.y>100 then …… '根据返回当前鼠标的坐标值执行某过程/程序
……
end sub

'为获取鼠标位置,引入API(写在模块开始处)
Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
   
'为获取鼠标位置,声明POINTAPI数据结构
Type POINTAPI
    X As Long
    Y As Long
End Type

'-------------------------------------------------------

Public Function get_point() As POINTAPI
'获取鼠标位置
    GetCursorPos get_point
   
    'MsgBox get_point.X & "," & get_point.Y
End Function

 


UBound(array)

 


'判断窗体是否打开(仅非模式有效)

If form1.Visible = True then