查表填表

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

原文地址:https://www.cnblogs.com/yiguxianyun/p/9603881.html