EXCEL常用函数公式和VBA汇总_vba与excel函数-程序员宅基地

技术标签: excel  EXCEL  VBA  vba  大数据  

EXCEL自学之路第一节


1.test01 excel生成目录
2.test02 打开全部隐藏工作表
3.test03 多个工作表汇总到一个工作表
4.test04 隔m列(行)插入n列空白列(行)
5.test05 合并工作簿
6.test06 更改工作表名
7.test07 解除excel结构限制
8.test08 解除工作表保护
9.test09 聚焦显示
10.test10 破解两位数及简单三位数密码
11.test11 批量修改文件名
12.test12 取消所有行列的隐藏
13.test13 列转行转置
14.test14 复制每一行为多行
15.test15 批量取消隐藏并删除隐藏工作表
16.test16 其它功能函数


前言

对于需要经常处理数据的同学们和企业中经常需要处理报表的同事来说,公式和VBA可以更快速有效的进行分析。

提示:以下是本篇文章正文内容

一、EXCEL函数和VBA?

EXCEL是常见的处理数据的一种工具,其中函数公式和VBA是为了解决批量数据分析任务而创建的。

二、使用方法

1.test01 excel生成目录

代码如下(示例):

方法一
定义公式名称
单击A1单元格,切换到公式选项定义名称,引用位置处
=INDEX(GET.WORKBOOK(1),ROW(A1))&T(NOW())
B1单元格内输入
=HYPERLINK("#'"&INDEX(mulu,ROW())&"'!A1",MID(INDEX(mulu,ROW()),FIND("]",INDEX(mulu,ROW()),1)+1,100))
比较
=IFERROR(HYPERLINK(catalog&"!A1",MID(catalog,FIND("]",catalog)+1,99)),"")
方法二
Sub mulu()
On Error GoTo Tuichu
Dim i As Integer
Dim ShtCount As Integer
Dim SelectionCell As Range
ShtCount = Worksheets.Count
If ShtCount = 0 Or ShtCount = 1 Then Exit Sub
Application.ScreenUpdating = False
For i = 1 To ShtCount
If Sheets(i).Name = "目录" Then
Sheets("目录").Move Before:=Sheets(1)
End If
Next i
If Sheets(1).Name <> "目录" Then
ShtCount = ShtCount + 1
Sheets(1).Select
Sheets.Add
Sheets(1).Name = "目录"
End If
Sheets("目录").Select
Columns("B:B").Delete Shift:=xlToLeft
Application.StatusBar = "正在生成目录…………请等待!"
For i = 2 To ShtCount
ActiveSheet.Hyperlinks.Add Anchor:=Worksheets("目录").Cells(i, 2), Address:="", SubAddress:= _
Sheets(i).Name & "!R1C1", TextToDisplay:=Sheets(i).Name
Next
Sheets("目录").Select
Columns("B:B").AutoFit
Cells(1, 2) = "目录"
Set SelectionCell = Worksheets("目录").Range("B1")
With SelectionCell
.HorizontalAlignment = xlDistributed
.VerticalAlignment = xlCenter
.AddIndent = True
.Font.Bold = True
.Interior.ColorIndex = 34
End With
Application.StatusBar = False
Application.ScreenUpdating = True
Tuichu:
End Sub 
方法三
建立目录和索引
Sub name_err()
    On Error GoTo ERR_1 '异常陷阱,异常捕获
    Worksheets("工作表目录").Activate   '这里可以变更为自己需要的程序语句
    Worksheets("工作表目录").Rows("1:" & Rows.Count).ClearContents
    Exit Sub    '没有遇到异常,则退出子程序
ERR_1:  '如果执行错误,则新建工作表
    Worksheets.Add.name = "工作表目录"  '这里可以变更为自己需要的程序语句
End Sub
Sub 工作簿中所有工作表建立目录()
    '为工作簿中所有工作表建立目录!
    Dim wt As Worksheet, sht As Worksheet, irow As Integer
    Call name_err
    'On Error GoTo 0    因为异常捕获是子程序,所以不会影响主程序的报错机制,这句话都会正常报错,而不会跳转到子程序的异常陷阱之中...
    With Worksheets("工作表目录")
    For Each sht In Worksheets
        irow = irow + 1      '行号加1,默认值为0
        .Cells(irow, 1).Value = irow '写入序号
        '写入工作表名,并建立超链接
        .Hyperlinks.Add Anchor:=.Cells(irow, 2), Address:="", SubAddress:="'" & sht.name & "'!A1", TextToDisplay:=sht.name
    Next
    End With
End Sub

2.test02 打开全部隐藏工作表

代码如下(示例):

方法一
Sub 打开全部隐藏工作表()
Dim i As Integer
For i = 1 To Sheets.Count
    Sheets(i).Visible = True
Next i
End Sub
方法二
Sub 批量取消隐藏工作表()
Dim sht As Worksheet
For Each sht In Worksheets
sht.Visible = xlSheetVisible
Next
End Sub

3.test03 多个工作表汇总到一个工作表

代码如下(示例):

方法一
Sub 工作表合并()
For Each st In Worksheets
If st.Name <> ActiveSheet.Name Then st.UsedRange.Offset(1, 0).Copy [a65536].End(xlUp).Offset(1, 0)
Next
End Sub
Sub 合并所有工作表_在所有行标注工作表名字_无视空行空列_考虑到不规范的多一点的行和列()
    Dim row_num As Long, column_num As Long, row_num_temp As Long, column_num_temp As Long, row_num_merge As Long, column_num_merge As Long, i As Long, arr() As Long
    Worksheets.Add.Name = "合并表"
    Sheets("合并表").Move before:=Sheets(1)
    For i = 2 To Worksheets.Count
        Worksheets(i).Activate
        'UsedRange.row,代表使用的第一个行数,在有空行的时候体现,同理,UsedRange.column,代表使用的第一个列数,在有空列的时候体现
        '那么使用第一行 + 已使用的行数,这样可以规避顶部/左侧有空行,导致获取已使用行号的数据不符合预期(老赵,如果你看到这里不懂,就自己拆开代码,加上空行空列体会一下)
        row_num = Worksheets(i).UsedRange.Row + Worksheets(i).UsedRange.Rows.Count - 1
        column_num = Worksheets(i).UsedRange.Column + Worksheets(i).UsedRange.Columns.Count - 1
        '如果格式很不规范,那么获取的UsedRange.rows.count就可能是整个表格的行数,所以要规避这种情况,如果相同,就让他减1
        If row_num = Worksheets(i).Rows.Count Then row_num = row_num - 1
        If column_num = Worksheets(i).Columns.Count Then column_num = column_num - 1
        
        '相当于遍历所有的列,都按ctrl + ↑,取数组的最大值
        ReDim arr(1 To column_num)
        For j = LBound(arr) To UBound(arr)
            row_num_temp = Worksheets(i).Cells(row_num + 1, j).End(xlUp).Row
            arr(j) = row_num_temp
        Next
        Debug.Print (Application.WorksheetFunction.Max(arr))
        row_num_temp = Application.WorksheetFunction.Max(arr) '赋予最大值,确定最大的有数据的行数
        
        '相当于遍历所有的行,都按ctrl + ←,取数组的最大值
        'Erase arr 清空数组,但是也可以不用,直接用ReDim也可以,如果要保留数组内容,需要加一个preserve
        ReDim arr(1 To row_num_temp)
        For j = LBound(arr) To UBound(arr)
            column_num_temp = Worksheets(i).Cells(j, column_num + 1).End(xlToLeft).Column
            arr(j) = column_num_temp
        Next
        Debug.Print (Application.WorksheetFunction.Max(arr))
        column_num_temp = Application.WorksheetFunction.Max(arr) '赋予最大值,确定最大的有数据的列数
        
        Worksheets(i).Range(Cells(1, 1), Cells(row_num_temp, column_num_temp)).Select
        Selection.Copy Sheets("合并表").Cells(row_num_merge + 1, 2)
        Worksheets("合并表").Cells(row_num_merge + 1, 1) = Worksheets(i).Name
        row_num_merge = Sheets("合并表").UsedRange.Rows.Count
    Next
    '将首行标题转为所有行(选择空值,=上面的数据)
    Worksheets("合并表").Activate
    Columns("A:A").Select
    Selection.SpecialCells(xlCellTypeBlanks).Select
    Application.CutCopyMode = False
    Selection.FormulaR1C1 = "=R[-1]C"
    Columns("A:A").Select
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    Application.CutCopyMode = False
    Range("A1").Select
End Sub

4.test04 隔m列(行)插入n列空白列(行)

Sub 在不同的列左侧插入指定数量的空白列()

    Dim m, n, i As Integer    

    For n = 5 To 1 Step -1

        Sheets("Sheet1").Columns(n).Select

        m = Sheets("Sheet2").Cells(1, n).Value

        For i = 1 To m Step 1

            Selection.Insert Shift:=xlToRight

        Next i

    Next n

End Sub


注释:
Sub 在不同的列左侧插入指定数量的空白列()

    Dim m, n, i As Integer    

    For n = 5 To 1 Step -1'在sheet1工作表中,假设A列共有5列,要在每列的左侧插入第2行对应数字的空白列数,记住,是在左侧插入空白列,不是在右侧插入空白列

        Sheets("Sheet1").Columns(n).Select '选中sheet1工作表中的第n列

        m = Sheets("Sheet2").Cells(1, n).Value'提前把sheet1工作表中第2行的数字放到sheet2工作表第一行的前5个单元格中,这一步是必要的,然后取出sheet2工作表第1行的第m个单元格中的数字,赋给变量n

        For i = 1 To m Step 1 '利用for...next 循环在sheet1表中第m列左侧插入n个空白列

            Selection.Insert Shift:=xlToRight '单纯这一句的话,只能在第m列左侧插入一个空白列

        Next i

    Next n

End Sub
Sub 在不同的行上面插入指定数量的空白行()

    Dim m, n, i As Integer

    For m = 30 To 1 Step -2

        Sheets("Sheet1").Rows(m & ":" & m).Select

        n = Sheets("Sheet2").Cells(m, 1).Value

        For i = 1 To 1 Step 1

            Selection.Insert Shift:=xlDown

        Next i

    Next m

End Sub

注释:
Sub 在不同的行上面插入指定数量的空白行()

    Dim m, n, i As Integer

    For m = 7 To 1 Step -1 '在sheet1工作表中,假设A列共有7行,要在每行的上面插入B列对应数字的行数,记住,是在上面插入空白行,不是在下面插入空白行

        Sheets("Sheet1").Rows(m & ":" & m).Select'选中sheet1工作表中的第m行

        n = Sheets("Sheet2").Cells(m, 1).Value'提前把sheet1工作表中B列的数字放到sheet2工作表A列的前7个单元格中,这一步是必要的,然后取出sheet2工作表A列第m个单元格中的数字,赋给变量n

        For i = 1 To n Step 1'利用for...next 循环在sheet1表中第m行上面插入n个空白行

            Selection.Insert Shift:=xlDown'单纯这一句的话,只能在第m行上面插入一个空白行

        Next i

    Next m

End Sub

5.test05 合并工作簿

Sub 合并工作薄()

Dim FileOpen

Dim X As Integer

Application.ScreenUpdating = False

FileOpen = Application.GetOpenFilename(FileFilter:="Microsoft Excel文件(.xlsx),.xlsx", MultiSelect:=True, Title:="合并工作薄")

X = 1

While X <= UBound(FileOpen)

Workbooks.Open Filename:=FileOpen(X)

Sheets().Move After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)

X = X + 1

Wend

ExitHandler:

Application.ScreenUpdating = True

Exit Sub

errhadler:

MsgBox Err.Description

End Sub

6.test06 更改工作表名

Sub 改工作表名test1()
Application.ScreenUpdating = False
For t = 1 To Sheets.Count
    If Sheets(t).Visible = True Then Sheets(t).Name = Sheets(t).Range("A1").Value
Next
Application.ScreenUpdating = True
End Sub

7.test07 解除excel结构限制

Private Sub VBAPassword()

    '你要解保护的Excel文件路径
    Filename = Application.GetOpenFilename("Excel文件(*.xlsx & *.xla & *.xlt),*.xlsx;*.xla;*.xlt", , "VBA破解")
    
    If Dir(Filename) = "" Then
    MsgBox "没找到相关文件,清重新设置。"
    Exit Sub
    Else
    FileCopy Filename, Filename & ".bak" '备份文件。
    End If
    
    Dim GetData As String * 5
    Open Filename For Binary As #1
    Dim CMGs As Long
    Dim DPBo As Long
    For i = 1 To LOF(1)
    Get #1, i, GetData
    If GetData = "CMG=""" Then CMGs = i
    If GetData = "[Host" Then DPBo = i - 2: Exit For
    Next
    
    If CMGs = 0 Then
    MsgBox "请先对VBA编码设置一个保护密码...", 32, "提示"
    Exit Sub
    End If
    
    Dim St As String * 2
    Dim s20 As String * 1
    
    '取得一个0D0A十六进制字串
    Get #1, CMGs - 2, St
    
    '取得一个20十六制字串
    Get #1, DPBo + 16, s20
    
    '替换加密部份机码
    For i = CMGs To DPBo Step 2
    Put #1, i, St
    Next
    
    '加入不配对符号
    If (DPBo - CMGs) Mod 2 <> 0 Then
    Put #1, DPBo + 1, s20
    End If
    MsgBox "文件解密成功......", 32, "提示"
    
    Close #1
    
End Sub

8.test08 解除工作表保护

Public Sub AllInternalPasswords()
' Breaks worksheet and workbook structure passwords. Bob McCormick
' probably originator of base code algorithm modified for coverage
' of workbook structure / windows passwords and for multiple passwords
'
' Norman Harker and JE McGimpsey 27-Dec-2002 (Version 1.1)
' Modified 2003-Apr-04 by JEM: All msgs to constants, and
' eliminate one Exit Sub (Version 1.1.1)
' Reveals hashed passwords NOT original passwords
Const DBLSPACE As String = vbNewLine & vbNewLine
Const AUTHORS As String = DBLSPACE & vbNewLine & _
"Adapted from Bob McCormick base code by" & _
"Norman Harker and JE McGimpsey"
Const HEADER As String = "AllInternalPasswords User Message"
Const VERSION As String = DBLSPACE & "Version 1.1.1 2003-Apr-04"
Const REPBACK As String = DBLSPACE & "Please report failure " & _
"to the microsoft.public.excel.programming newsgroup."
Const ALLCLEAR As String = DBLSPACE & "The workbook should " & _
"now be free of all password protection, so make sure you:" & _
DBLSPACE & "SAVE IT NOW!" & DBLSPACE & "and also" & _
DBLSPACE & "BACKUP!, BACKUP!!, BACKUP!!!" & _
DBLSPACE & "Also, remember that the password was " & _
"put there for a reason. Don't stuff up crucial formulas " & _
"or data." & DBLSPACE & "Access and use of some data " & _
"may be an offense. If in doubt, don't."
Const MSGNOPWORDS1 As String = "There were no passwords on " & _
"sheets, or workbook structure or windows." & AUTHORS & VERSION
Const MSGNOPWORDS2 As String = "There was no protection to " & _
"workbook structure or windows." & DBLSPACE & _
"Proceeding to unprotect sheets." & AUTHORS & VERSION
Const MSGTAKETIME As String = "After pressing OK button this " & _
"will take some time." & DBLSPACE & "Amount of time " & _
"depends on how many different passwords, the " & _
"passwords, and your computer's specification." & DBLSPACE & _
"Just be patient! Make me a coffee!" & AUTHORS & VERSION
Const MSGPWORDFOUND1 As String = "You had a Worksheet " & _
"Structure or Windows Password set." & DBLSPACE & _
"The password found was: " & DBLSPACE & "$$" & DBLSPACE & _
"Note it down for potential future use in other workbooks by " & _
"the same person who set this password." & DBLSPACE & _
"Now to check and clear other passwords." & AUTHORS & VERSION
Const MSGPWORDFOUND2 As String = "You had a Worksheet " & _
"password set." & DBLSPACE & "The password found was: " & _
DBLSPACE & "$$" & DBLSPACE & "Note it down for potential " & _
"future use in other workbooks by same person who " & _
"set this password." & DBLSPACE & "Now to check and clear " & _
"other passwords." & AUTHORS & VERSION
Const MSGONLYONE As String = "Only structure / windows " & _
"protected with the password that was just found." & _
ALLCLEAR & AUTHORS & VERSION & REPBACK
Dim w1 As Worksheet, w2 As Worksheet
Dim i As Integer, j As Integer, k As Integer, l As Integer
Dim m As Integer, n As Integer, i1 As Integer, i2 As Integer
Dim i3 As Integer, i4 As Integer, i5 As Integer, i6 As Integer
Dim PWord1 As String
Dim ShTag As Boolean, WinTag As Boolean
Application.ScreenUpdating = False
With ActiveWorkbook
WinTag = .ProtectStructure Or .ProtectWindows
End With
ShTag = False
For Each w1 In Worksheets
ShTag = ShTag Or w1.ProtectContents
Next w1
If Not ShTag And Not WinTag Then
MsgBox MSGNOPWORDS1, vbInformation, HEADER
Exit Sub
End If
MsgBox MSGTAKETIME, vbInformation, HEADER
If Not WinTag Then
MsgBox MSGNOPWORDS2, vbInformation, HEADER
Else
On Error Resume Next
Do 'dummy do loop
For i = 65 To 66: For j = 65 To 66: For k = 65 To 66
For l = 65 To 66: For m = 65 To 66: For i1 = 65 To 66
For i2 = 65 To 66: For i3 = 65 To 66: For i4 = 65 To 66
For i5 = 65 To 66: For i6 = 65 To 66: For n = 32 To 126
With ActiveWorkbook
.Unprotect Chr(i) & Chr(j) & Chr(k) & _
Chr(l) & Chr(m) & Chr(i1) & Chr(i2) & _
Chr(i3) & Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
If .ProtectStructure = False And _
.ProtectWindows = False Then
PWord1 = Chr(i) & Chr(j) & Chr(k) & Chr(l) & _
Chr(m) & Chr(i1) & Chr(i2) & Chr(i3) & _
Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
MsgBox Application.Substitute(MSGPWORDFOUND1, _
"$$", PWord1), vbInformation, HEADER
Exit Do 'Bypass all for...nexts
End If
End With
Next: Next: Next: Next: Next: Next
Next: Next: Next: Next: Next: Next
Loop Until True
On Error GoTo 0
End If
If WinTag And Not ShTag Then
MsgBox MSGONLYONE, vbInformation, HEADER
Exit Sub
End If
On Error Resume Next
For Each w1 In Worksheets
'Attempt clearance with PWord1
w1.Unprotect PWord1
Next w1
On Error GoTo 0
ShTag = False
For Each w1 In Worksheets
'Checks for all clear ShTag triggered to 1 if not.
ShTag = ShTag Or w1.ProtectContents
Next w1
If ShTag Then
For Each w1 In Worksheets
With w1
If .ProtectContents Then
On Error Resume Next
Do 'Dummy do loop
For i = 65 To 66: For j = 65 To 66: For k = 65 To 66
For l = 65 To 66: For m = 65 To 66: For i1 = 65 To 66
For i2 = 65 To 66: For i3 = 65 To 66: For i4 = 65 To 66
For i5 = 65 To 66: For i6 = 65 To 66: For n = 32 To 126
.Unprotect Chr(i) & Chr(j) & Chr(k) & _
Chr(l) & Chr(m) & Chr(i1) & Chr(i2) & Chr(i3) & _
Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
If Not .ProtectContents Then
PWord1 = Chr(i) & Chr(j) & Chr(k) & Chr(l) & _
Chr(m) & Chr(i1) & Chr(i2) & Chr(i3) & _
Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
MsgBox Application.Substitute(MSGPWORDFOUND2, _
"$$", PWord1), vbInformation, HEADER
'leverage finding Pword by trying on other sheets
For Each w2 In Worksheets
w2.Unprotect PWord1
Next w2
Exit Do 'Bypass all for...nexts
End If
Next: Next: Next: Next: Next: Next
Next: Next: Next: Next: Next: Next
Loop Until True
On Error GoTo 0
End If
End With
Next w1
End If
MsgBox ALLCLEAR & AUTHORS & VERSION & REPBACK, vbInformation, HEADER
End Sub

9.test09 聚焦显示

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Cells.Interior.ColorIndex = 0
Target.EntireColumn.Interior.ColorIndex = 15
Target.EntireRow.Interior.ColorIndex = 15
Target.Interior.ColorIndex = 0
End Sub

10.test10 破解两位数及简单三位数密码

Sub crack()
Dim i As Long
Dim FileName As String
i = 0
FileName = Application.GetOpenFilename("Excel文件(*.xls & *.xlsx),*.xls;*.xlsx", , "VBA破解")
FileName = Right(FileName, Len(FileName) - InStrRev(FileName, "\"))
Application.ScreenUpdating = False
line2: On Error GoTo line1
Workbooks.Open FileName, , True, , i
MsgBox "Password is " & i
Exit Sub
line1: i = i + 1
Resume line2
Application.ScreenUpdating = True
End Sub

11.test11 bat批量修改文件名

步骤一
dir *.png /b>rename.xls
dir *.后缀名 /b>rename.xls
步骤二
从产生的.xls文件中修改文件名
步骤三
ren 原文件名 现文件名
步骤四
修改为.bat文件
方法二
@echo off
set /p w=请输入文件格式(即扩展名并以回车结束):
set /p wf=请输入要修改的文字(以回车结束):
set /p cb=请输入要改成的文字(若是删除则直接回车,以回车结束):
for /f "delims=" %%i in ('dir /b /a-d "*.%w%"' ) do ( 
set str1=%%i 
setlocal EnableDelayedExpansion
set "str1=!str1:%wf%=%cb%!"
ren "%%i" "!str1!"
endlocal
)
pause

备注:若bat打开出现乱码,鼠标右键,编辑,另存为,编译方式改为ANSI

12.test12 取消所有行列的隐藏

Sub 针对所有工作表_取消所有行_所有列的隐藏项()
    Dim sht As Worksheet
    For Each sht In Worksheets
        sht.Activate
        Cells.EntireColumn.Hidden = False
        Cells.EntireRow.Hidden = False
    Next
End Sub

13.test13 列转行转置

Sub excel数据整理()

start_row = 2  
start_col = 3
end_col = 6
counts = 40
    For i = 0 To counts
        Range(Cells(start_row + 9 * i, start_col), Cells(start_row + 9 + 9 * i, start_col)).Select
        Selection.Copy
        Cells(i + 1, end_col).Select
        Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
        False, Transpose:=True
    Next i
    
End Sub


注释:
Sub excel数据整理()

start_row = 2  第二列
start_col = 3   第三列
end_col = 6    将数据转置到第六列
counts = 40
    For i = 0 To counts
        Range(Cells(start_row + 9 * i, start_col), Cells(start_row + 9 + 9 * i, start_col)).Select
        Selection.Copy
        Cells(i + 1, end_col).Select
        Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
        False, Transpose:=True
    Next i
    
End Sub

14.test14 复制每一行为多行

1.插入所需空白行
2.全选
3.F5定位空白
4.=+ctrl+方向上键
5.按住ctrl+enter

15.test15 批量取消隐藏并删除隐藏工作表

Sub 批量取消隐藏工作表并且删除()
    Dim sht As Worksheet
    For Each sht In Worksheets
      '如果不是显示状态&#xff08;返回值是0&#xff0c;也可以写为&#xff1a;(xlSheetVisible)&#xff09;&#xff0c;则删除
        If sht.Visible <> xlSheetVisible Then
            sht.Visible = xlSheetVisible
            Application.DisplayAlerts = False    '删除时不用确认
            sht.Delete
        End If
    Next
   '恢复确认&#xff0c;其实很多人不写这一句&#xff0c;作为小程序写不写倒也无所谓的啦&#xff0c;不影响你后面的程序执行&#xff0c;不过如果你的代码很多&#xff0c;流程很长&#xff0c;建议还是写上去&#xff0c;防止预期之外的的错误发生
    Application.DisplayAlerts = True
End Sub

16.test16 其它功能函数

excel将多列数据集中到一列
=OFFSET($A$1,MOD(ROW(A14),14),CEILING(ROW(A1),14)/14)

excel将一列数据拆分为多列
=OFFSET($A$1,MOD(COLUMN(A1)+7,8)+ROW(A1)*8-7,)

身份证提取出生日期
=CONCATENATE(MID(A2,7,4),"/",MID(A2,11,2),"/",MID(A2,13,2))
 
计算年龄
=TRUNC((DAYS360(C2,"2021/6/22",FALSE))/360,0)
=DATEDIF($C2,TODAY(),"y")
判断男女
=IF(LEN(A2)=15,IF(MOD(MID(A2,15,1),2)=1,"男","女"),IF(MOD(MID(A2,17,1),2)=1,"男","女"))
=IF(MOD(MID(A2,17,1),2)=1,"男","女")

多列拆分
=OFFSET($A$1,INT(COLUMN(C1)/3)+ROW(A1)*5-5,MOD(COLUMN(C1),3))

等差为4的数列
=IF(MOD(ROW(),1)=0,SUM(A1,4),"")
隔一行等差为4的数列
=IF(MOD(ROW(),2)=1,SUM(B1,4),"")
隔两行等差为4的数列
=IF(MOD(ROW(),3)=1,SUM(C1,4),"")
各三行等差为4的数列
=IF(MOD(ROW(),4)=1,SUM(D1,4),"")4行等比为4的数列
=IF(MOD(ROW(),4)=1,PRODUCT(F1,4),"")

引用指定单元格为工作表名的指定数据
=INDIRECT("'"&A2&"'"&"!FV7")

输出不重复项
=INDEX(抽检数据!C3:C8888,MATCH(,COUNTIFS($C1:C$1,抽检数据!C4:C8888),)+1)&""
=LOOKUP(,1/(COUNTIF(E$1:E1,抽检数据!$C$3:$C$5589)-1),抽检数据!C$3:C$5589)

条件求和
=SUMIF(D2:D5,F2,C2:C5)
多条件求和
=SUMIFS(D2:D9,B2:B9,F2,C2:C9,G2)
条件计数
=COUNTIF(B2:B12,E3)
多条件计数
=COUNTIFS(B2:B9,F2,C2:C9,G2)
条件查找
=VLOOKUP($F$5,$B$1:$D$10,2,0)
多条件查找
=LOOKUP(1,0/((B2:B9=F2)*(C2:C9=G2)),A2:A9)

多列中都有的数据判断:
=IF(AND(COUNTIF(B:B,E1),COUNTIF(C:C,E1),COUNTIF(A:A,E1)),"√","")=COUNTIF(A:A,E1)*COUNTIF(B:B,E1)*COUNTIF(C:C,E1)


总结

以上就是今天要讲的内容,本文仅仅简单介绍了部分常用公式和VBA的使用,其中错误的地方欢迎大家批评指正。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_45365214/article/details/120467740

智能推荐

浅析僵尸进程和孤儿进程_sched_autogroup_exit_task-程序员宅基地

文章浏览阅读478次。僵尸进程与孤儿进程的定义僵尸进程一个进程如果创建出子进程,如果此时子进程退出,而父进程没有进行善后工作(waitwaitwait与waitpidwaitpidwaitpid获取子进程状态信息),那么此时子进程的进程描述符仍然保存在系统中。孤儿进程如果一个父进程退出,它的子进程(有一个或者多个)还在,那么子进程将成为孤儿进程,这个时候这些孤儿进程会被111号进程,也就是initinitinit进程所收养,并且由initinitinit进程完成善后工作(状态收集)。过程分析上面都是那些老八股文里_sched_autogroup_exit_task

标准化拉普拉斯矩阵特征值范围为什么小于等于2?(证明)_正则化后的拉普拉斯矩阵特征值最大不超过2-程序员宅基地

文章浏览阅读2.1k次,点赞7次,收藏22次。标准化拉普拉斯矩阵特征值范围及证明_正则化后的拉普拉斯矩阵特征值最大不超过2

矩阵的特征值及特征向量理解_矩阵特征值-程序员宅基地

文章浏览阅读2.9k次,点赞4次,收藏16次。一、特征值&特征向量1.1 直观印象如果把矩阵看作是运动,对于运动而言,最重要的是运动的速度和方向,那么:特征值就是运动的速度特征向量就是运动的方向既然运动最重要的两方面都被描述了,特征值、特征向量自然可以称为运动(矩阵)的特征。注意:由于矩阵是数学概念,非常抽象,所以上面所谓的运动、运动的速度、运动的方向都是广义的,在现实中有不同的替代。1.1.1 几何意义在下面的图中画出了基和向量(在i→,j→\overrightarrow{i},\overrightarrow{j}i,j​_矩阵特征值

Java学习笔记-静态变量、静态常量与静态方法_静态方法 和静态常量-程序员宅基地

文章浏览阅读803次,点赞2次,收藏3次。1.静态变量看到一位大神写得非常赞,我直接copy了这一段什么叫静态与非静态?静态:对于该类的对象来说,都只有一个。叫作类变量。非静态:每个该类的对象都各有一个拷贝。叫作成员变量。比如工商银行卡类:他们有一个静态的银行卡名称叫:工商银行卡–>静态。每个卡又月自己的卡号–>非静态。在创建对象的时候,需要每个成员变量(非静态)开辟内存空间,类变量(静态变量)则是在类加载的时候..._静态方法 和静态常量

初识eBPF_ebpf 观测文件打开 c++-程序员宅基地

文章浏览阅读103次。eBPF 被广泛用于驱动各种用例:在现代数据中心和云原生环境中提供高性能网络和负载平衡,以低开销提取细粒度的安全可观测性数据,帮助应用程序开发人员跟踪应用程序,为性能故障排除、预防性应用程序和容器运行时安全实施提供见解等等。相反,eBPF 程序可以将函数调用到帮助程序函数中,这是内核提供的众所周知且稳定的 API。即时 (JIT) 编译步骤将程序的通用字节码转换为特定于机器的指令集,以优化程序的执行速度。eBPF Go库提供了一个通用的eBPF库,它将获取eBPF字节码的过程与eBPF程序的加载到内核中。_ebpf 观测文件打开 c++

Linux bootmem (4)___pi_memset-程序员宅基地

文章浏览阅读282次。映射kernel地址空间swapper_pg_dir其实就是swapper进程(pid等于0的那个,其实就是idle进程)的地址空间,用它来代表kernel地址空间。和恒等映射的区别是,这段空间映射没有扩展页表的需求,当然它也是使用section mapping。和前面的恒等映射一样,swapper_pg_dir也是需要3个页面。映射kernel空间adrp x0, swapper_...___pi_memset

随便推点

Android 中开发dip(分辨率)和px(像素)互转_像素单位和分辨率互转-程序员宅基地

文章浏览阅读318次。什么是分辨率,什么是像素?这里不解释了, 自己搜索吧直接上代码:public class DensityUtil { /** * 根据手机的分辨率从 dip 的单位 转成为 px(像素) */ public static int dip2px(Context context, float dpValue) { final float_像素单位和分辨率互转

框架设计原理与实战:构建小程序的Uniapp框架_uniapp小程序的设计模式-程序员宅基地

文章浏览阅读30次。作者:禅与计算机程序设计艺术 1.背景介绍目前小程序火爆全球,微信又推出了支付宝小程序平台,但是这些小程序仍然受到系统限制。小程序框架带来了很多优点,比如跨端一致性、性能优化、动态化、快速迭代等。Uni-app是一个开源的小程序开发框架,基于Vue.js开发,集成了Vue生态圈的方方面面,提供了一_uniapp小程序的设计模式

概率论--错题-程序员宅基地

文章浏览阅读102次。转载于:https://www.cnblogs.com/ruruozhenhao/p/7513201.html_下面关于支持向量机(svm)的描述错误的是 是一种生成式模型

Nexus3 搭建私服 maven 仓库_nexus3配置阿里云仓库-程序员宅基地

文章浏览阅读1.8k次,点赞4次,收藏10次。上篇文章实验了使用搭建私服 仓库及代理仓库,本篇文章继续使用 搭建私服 仓库,有关 的安装请参考上篇博客:下面开始实验 私服的搭建:在 安装完毕后,细心的小伙伴应该可以看出, 已经帮我们搭建好了一套 maven 私服:其中 和上篇文章搭建 私服中的概念是一样的:(代理仓库):用来代理远程的公共仓库,默认是从远程中央仓库中寻找数据的仓库下载需要的 jar 包。(宿主仓库):用来部署我们自己项目打包的构建,供内部人员下载。(仓库组):用来合并多个hosted/proxy仓库,都加入到一个仓库_nexus3配置阿里云仓库

erlang mysql driver_erlang_mysql_driver 源码分析1-程序员宅基地

文章浏览阅读134次。erlang_mysql_driver 是个mysql的数据库驱动源码主要包含 mysql mysql_conn mysql_recv mysql_auth 这几个模块mysql模块提供给外部调用的接口,包括启动、添加连接、执行sql语句。mysql模块的另一主要功能是维护mysql_conn连接池,在执行sql语句时,选择合适的mysql_conn进程进行sql处理。mysql_conn 和 m..._timeout:{gen_server,call,[mysql_dispatcher,{fetch,mysql_conn,

使用nginx作为vue项目服务器,解决vue路由404问题。_vue nginx 路由重写-程序员宅基地

文章浏览阅读3.7k次,点赞3次,收藏9次。打包好的vue项目上传到linux服务器上,使用nginx作为服务器时,vue项目的路由失效问题。解决方案:配置nginx.conf添加如下配置location / { root /usr/local/~~; # 指定vue项目文件的位置,注:用户目录的话会出现403问题 index index.html; # 访问 / 时跳的页面 try_fil..._vue nginx 路由重写

推荐文章

热门文章

相关标签