• 查表填表


    Private Sub Workbook_Open()
    '    Set 当前表 = ActiveSheet
    '
    '    文件短名称 = "查表填表.xlsm"
    '    文件全名 = "D:余魁swvba" & 文件短名称
    '    For Each kk In Workbooks
    '        Debug.Print kk.Name
    '        If kk.Name = 文件短名称 Then
    '            已打开表 = True
    '            Exit For
    '        End If
    '    Next
    '    If Not 已打开表 Then
    '        Workbooks.Open 文件全名
    '    End If
    '
    '    当前表.Activate
        Application.OnKey "%q", "粘贴到目的表"
    End Sub
    
    
    'Application.OnKey 方法(Excel)
    '
    'office 365 dev account|上次更新日期: 2017/10/3|1 投稿人
    '當按下特定鍵或組合鍵時會執行指定的程序。
    '
    '語法
    '
    '運算式 .OnKey(Key, Procedure)
    '
    '運算式 代表 Application 物件的變數。
    '
    '參數
    '
    '名稱    必要/選用   資料類型    描述
    'Key 必要    String  代表要按下按鍵的字串。
    'Procedure   選用    Variant 指出要執行的程序之名稱字串。如果 Procedure 為 "" (空字串),則在按下 Key 時並不會觸發任何作業。這種 OnKey 方法會變更 Microsoft Excel 中按鍵的正常結果。如果省略 Procedure,則 Key 會回復到其在 Microsoft Excel 中的正常結果,同時會清除先前使用 OnKey 方法指派的任何特殊鍵。
    '註解
    '
    'Key 參數可指定任何單個鍵,可指定任何與 ALT、CTRL 或 SHIFT 的組合鍵,還可以指定這些鍵的任何組合 (在 Windows 中)。每一鍵的名稱可由一個或多個字元表示,比如 "a" 表示字元 a,或者 "{ENTER}" 表示 ENTER 鍵。
    '
    '要指定非顯示文字符對應的鍵 (例如 ENTER 鍵或 TAB 鍵),可使用下表所列示的代碼。表中的每一代碼表示鍵盤上的一個對應鍵。
    '
    '索引鍵 資料類型碼
    'BACKSPACE   {BACKSPACE} 或 {BS}
    'BREAK   {BREAK}
    'CAPS LOCK   {CAPSLOCK}
    'CLEAR   {CLEAR}
    'DELETE 或 DEL   {DELETE} 或 {DEL}
    '向下鍵  {DOWN}
    'END {END}
    'ENTER (數字小鍵盤)  {ENTER}
    'ENTER   ~ (波狀符號)
    'ESC { ESCAPE} 或 {ESC}
    'HELP    {HELP}
    'HOME    {HOME}
    'INS {INSERT}
    '向左鍵  {LEFT}
    'NUM LOCK    {NUMLOCK}
    'PAGE DOWN   {PGDN}
    'PAGE UP {PGUP}
    'RETURN  {RETURN}
    '向右鍵  {RIGHT}
    'SCROLL LOCK {SCROLLLOCK}
    'TAB {TAB}
    '向上鍵  {UP}
    'F1 到 F15   {F1} 到 {F15}
    '您也可指定與 SHIFT 鍵和/或 CTRL 鍵和/或 ALT 鍵的組合鍵。要指定與這些鍵的組合可使用下表提供的方法。
    '
    '要組合的按鍵 在按鍵代碼之前加上
    'SHIFT (加號)
    'CTRL    ^ (指數)
    'ALT 鍵  % (百分號)
    '若為特定字元指定處理程序 (如 +、^、% 等等),可將此字元用圓括弧括起。有關詳細資料,請參閱範例。
    '
    '範例
    '
    '本範例會為 CTRL + 加號的按鍵組合指派 "InsertProc",並為 SHIFT + CTRL + 向右鍵的按鍵組合指派 "SpecialPrintProc"。
    '
    'Application.OnKey "^{+}", "InsertProc"
    'Application.OnKey "+^{RIGHT}", "SpecialPrintProc"
    '本範例會將 SHIFT + CTRL + 向右鍵回復到其正常意義。
    '
    'Application.OnKey "+^{RIGHT}"
    '本範例會停用 SHIFT + CTRL + 向右鍵的按鍵組合。
    '
    'Application.OnKey "+^{RIGHT}", ""
    ThisWorkbook
    Sub 粘贴到目的表cs()
        Dim rng As Range
        Set rng = Application.InputBox("选择目的单元格", Type:=8)
        Debug.Print rng.Address
        Debug.Print rng.Row
        Debug.Print rng.AddressLocal
        Debug.Print rng.AddIndent
        Debug.Print rng.Cells(1, 1)
        Debug.Print rng.Worksheet
        Debug.Print rng.Worksheet.Cells(1, 1)
    End Sub
    Sub 粘贴到目的表()
        Debug.Print ThisWorkbook.Name
        
        On Error Resume Next
        表头行 = ActiveSheet.Range("1:10").Find("此行为表头行").Row
        If 表头行 = 0 Then Exit Sub
        
        Set 拟粘贴表字典 = CreateObject("Scripting.Dictionary")
        Set 当前表头 = CreateObject("Scripting.Dictionary")
        首列 = 1
        Call 识别表头(当前表头)
        
        Set 拟粘贴行号 = CreateObject("Scripting.Dictionary")
        For Each c In Selection.Cells
            Debug.Print c.Row
            拟粘贴行号.Add c.Row, ""
            Call Excel转字典单行(拟粘贴表字典, c.Row)
        Next
        
        表头行 = ActiveSheet.Range("1:10").Find("目的表头行→").Offset(0, 1) '设置目的表的表头行默认值,公用了全局变量“表头行”
        含数量 = (ActiveSheet.Range("1:10").Find("粘贴数量列?→").Offset(0, 1) = "")
        
        Dim rng As Range
        On Error Resume Next
        Set rng = Application.InputBox("选择想粘贴到的 目的单元格", Type:=8)
        If rng Is Nothing Then Err.Clear: Exit Sub
        
        目的行 = rng.Row
        rng.Worksheet.Activate
        
        On Error Resume Next
        表头行 = ActiveSheet.Range("1:10").Find("此行为表头行").Row '如果目的表定义了表头行名称则覆盖前面的默认值
        Set 目的表头 = CreateObject("Scripting.Dictionary")
        Call 识别表头(目的表头)
            
        '处理别名==开始
        If 目的表头.Exists("名称及规格") And Not 当前表头.Exists("名称及规格") And 当前表头.Exists("名称") Then
            For Each 行号 In 拟粘贴行号
                当前表头.Add "名称及规格", ""
                Set 拟粘贴表字典(行号)("名称及规格") = 拟粘贴表字典(行号)("名称")
            Next
        End If
        '处理别名==结束
        
        
        Dim 目的单元格 As Range
        For Each 列名 In 目的表头
            If 当前表头.Exists(列名) And 列名 <> "序号" Then
                If 列名 <> "数量" Or (列名 = "数量" And 含数量) Then
                    当前目的行 = 目的行
                    For Each 行号 In 拟粘贴行号
                        Set 目的单元格 = Cells(当前目的行, 目的表头(列名))
                        目的单元格 = 拟粘贴表字典(行号)(列名)
                        If 目的单元格.Value = "米2" Then
                           目的单元格.Characters(2, 1).Font.Superscript = True
                        End If
                        当前目的行 = 当前目的行 + 1
                    Next
                End If
            End If
        Next
        
        
        
        
    End Sub
    
    Sub TestFind()
    
    Debug.Print ActiveSheet.Range("1:10").Find("目的表头行").Address
    
    End Sub
    '先将单元格的链接的位置设为单元格本身,如单元格"A1"的链接地址设为"A1"
    'Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink)
    '    If Target.SubAddress = ActiveSheet.Name & "!A1" Then   'a1单元格的链接
    '        宏1
    '    ElseIf Target.SubAddress = ActiveSheet.Name & "!A2" Then 'a2单元格的链接
    '        宏2
    '    End If
    'End Sub
    'Sub 宏1()
    '    MsgBox "我的位置是" & ActiveCell.Address
    'End Sub
    'Sub 宏2()
    '    MsgBox "我的位置是" & ActiveCell.Address
    'End Sub
    '
    Sub test()
        MsgBox ActiveSheet.Rows.Count
    End Sub
    Module2粘贴到目的表
    Public 禁止改变 As Boolean
    Public 表头行 As Integer
    Public 末行 As Long
    '
    Public 首列 As Integer
    Public 末列 As Integer
    Public 文件名称列号 As Integer
    Public 文件路径列号 As Integer
    Public 代号列号 As Integer
    Public 名称列号 As Integer
    Public 项目号列 As Integer
    Sub 获取行列号()
        首列 = 1
        表头行 = Range("表头行").Row
    '    表头行 = ActiveSheet.Range("1:10").Find("此行为表头行").Row
        
        Cells.EntireColumn.Hidden = False
        If Cells(表头行 + 1, 首列) <> "" Then
            末行 = Cells(表头行, 首列).End(xlDown).Row
        Else
            末行 = 表头行 + 1
        End If
        末列 = Cells(表头行, 首列).End(xlToRight).Column
        
        文件名称列号 = Range("文件名称").Column
        文件路径列号 = Range("文件路径").Column
        项目号列 = Range("项目号").Column
        代号列号 = Range("代号").Column
        名称列号 = Range("名称").Column
    End Sub
    Sub Excel转字典(ByRef 字典)
        获取行列号
        For 当前行 = 表头行 + 1 To 末行
            Call Excel转字典单行(字典, 当前行)
        Next 当前行
    End Sub
    Sub Excel转字典单行(ByRef 字典, ByVal 当前行)
        If Not 字典.Exists(当前行) Then
            Set 字典(当前行) = CreateObject("Scripting.Dictionary")
            For 列号 = 首列 To 末列
                k = Cells(表头行, 列号)
                Set v = Cells(当前行, 列号)
                字典(当前行).Add k, v
            Next
        End If
    End Sub
    Sub 清除()
    '    获取行列号
    '    Dim 末行%
    '    末行 = Cells(65536, 文件名称列号).End(3).Row + 1
        Cells(表头行 + 1, 1).Resize(末行 - 表头行, 末列).Interior.Pattern = xlNone
        Cells(表头行 + 1, 1).Resize(末行 - 表头行, 末列).ClearContents
        Cells.ClearOutline
        Cells(表头行 + 1, 1).Select
    End Sub
    
    Sub 识别表头(ByRef 表头)
        末列 = Cells(表头行, 首列).End(xlToRight).Column
        For 列号 = 首列 To 末列
            k = Cells(表头行, 列号)
            v = Cells(表头行, 列号).Column
            表头.Add k, v
        Next
    End Sub
    模块1

  • 相关阅读:
    web页面性能优化之接口前置
    python大佬养成计划----flask_bootstrap装饰网页
    撸个查询物流的小程序,欢迎体验
    FullCalendar插件的基本使用
    GeekforGeeks Trie
    使用Django和Python创建Json response
    nginx-gridfs的安装
    Linux kernel config and makefile system
    hadoop日志分析
    安装STS报错(三)
  • 原文地址:https://www.cnblogs.com/yiguxianyun/p/9603881.html
Copyright © 2020-2023  润新知