国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Excel·VBA表格橫向、縱向相互轉(zhuǎn)換

這篇具有很好參考價值的文章主要介紹了Excel·VBA表格橫向、縱向相互轉(zhuǎn)換。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

Excel·VBA表格橫向、縱向相互轉(zhuǎn)換,excel,vba,excel,vba,橫向轉(zhuǎn)換,縱向轉(zhuǎn)換
如圖:對圖中區(qū)域 A1:M6 橫向表格,轉(zhuǎn)換成區(qū)域 A1:C20 縱向表格,即 B:M 列轉(zhuǎn)換成每2列一組按行寫入,并刪除空行。同理,反向操作就是縱向表格轉(zhuǎn)換成橫向表格

橫向轉(zhuǎn)縱向

實現(xiàn)方法1

本文圖1中,按“交期和交貨數(shù)量”每5行2列為一組,依次按行寫入,即按“交期”順序排列

Sub 表格橫向轉(zhuǎn)縱向1()
    '分段轉(zhuǎn)換,轉(zhuǎn)換列之前同名不連續(xù);不使用動態(tài)獲取每行最后一列是考慮到部分選中拆分
    Dim num_col&, title_row&, del_empty As Boolean, rng As Range, del_rng As Range
    Dim first_col&, resize_r&, resize_c&, keep_rng, arr, brr, b$, r&, i&, j&
'--------------------參數(shù)填寫:num_col、title_row都為數(shù)字,選中后才可運行代碼
    num_col = 2    '需要拆分的數(shù)據(jù)每行固定的列數(shù)
    title_row = 1  '表頭行數(shù)
    del_empty = True  '是否刪除空行
    If Selection.Count = 1 Then Debug.Print "未選中列,無法運行代碼": Exit Sub
    Set rng = Intersect(ActiveSheet.UsedRange, Selection)  'intersect語句避免選擇整列造成無用計算
    '選中區(qū)域開始列號,轉(zhuǎn)換行數(shù)、列數(shù)
    first_col = rng.column: resize_r = rng.Rows.Count - title_row: resize_c = rng.Columns.Count
    If resize_c Mod num_col <> 0 Then Debug.Print "選中列數(shù)不可平分": Exit Sub
    
    With ActiveSheet
        keep_rng = .Cells(title_row + 1, 1).Resize(resize_r, first_col - 1)  '不變區(qū)域
        arr = .Cells(title_row + 1, first_col).Resize(resize_r, resize_c)    '轉(zhuǎn)換區(qū)域
        r = title_row + 1  '寫入行號
        For i = num_col + 1 To UBound(arr, 2) Step num_col
            r = r + resize_r: .Cells(r, 1).Resize(resize_r, first_col - 1) = keep_rng
            For j = 1 To num_col
                brr = Application.index(arr, , i + j - 1)  '按列拆分
                .Cells(r, first_col + j - 1).Resize(resize_r, 1) = brr
            Next
        Next
        If del_empty Then  '刪除空行
            For i = title_row + 1 To r + resize_r
                brr = .Cells(i, first_col).Resize(1, num_col)
                If num_col > 1 Then  'brr是否為數(shù)組
                    b = Join(WorksheetFunction.Transpose(WorksheetFunction.Transpose(brr)), "")
                ElseIf num_col = 1 Then
                    b = brr
                End If
                If Len(b) = 0 Then
                    If del_rng Is Nothing Then
                        Set del_rng = .Rows(i)
                    Else
                        Set del_rng = Union(del_rng, .Rows(i))
                    End If
                End If
            Next
            If Not del_rng Is Nothing Then del_rng.Delete  '刪除行
        End If
        .Cells(1, first_col + num_col).Resize(1, resize_c - num_col).EntireColumn.Delete  '刪除選中列
    End With
End Sub
轉(zhuǎn)換結(jié)果

本文圖1(轉(zhuǎn)換前不含7-20行),選中 B:M 列,運行代碼得到如下圖結(jié)果: D:M 列被刪除
Excel·VBA表格橫向、縱向相互轉(zhuǎn)換,excel,vba,excel,vba,橫向轉(zhuǎn)換,縱向轉(zhuǎn)換

實現(xiàn)方法2

本文圖1中,按“產(chǎn)品規(guī)格”每個產(chǎn)品后面6組“交期和交貨數(shù)量”轉(zhuǎn)換為每6行2列,依次按行寫入,即按“產(chǎn)品”順序排列

以下代碼使用了數(shù)組行列數(shù)轉(zhuǎn)換函數(shù),調(diào)用了wraparr函數(shù),代碼詳見《Excel·VBA單元格區(qū)域行列數(shù)轉(zhuǎn)換函數(shù)》(如需使用代碼需復(fù)制)

Sub 表格橫向轉(zhuǎn)縱向2()
    '按行轉(zhuǎn)換,轉(zhuǎn)換列之前同名連續(xù);不使用動態(tài)獲取每行最后一列是考慮到部分選中拆分
    Dim num_col&, title_row&, del_empty As Boolean, rng As Range, del_rng As Range
    Dim first_col&, last_row&, resize_r&, resize_c&, keep_rng, arr, brr, b$, r&, i&, j&
'--------------------參數(shù)填寫:num_col、title_row都為數(shù)字,選中后才可運行代碼
    num_col = 2    '需要拆分的數(shù)據(jù)每行固定的列數(shù)
    title_row = 1  '表頭行數(shù)
    del_empty = True  '是否刪除空行
    If Selection.Count = 1 Then Debug.Print "未選中列,無法運行代碼": Exit Sub
    Set rng = Intersect(ActiveSheet.UsedRange, Selection)  'intersect語句避免選擇整列造成無用計算
    '選中區(qū)域開始列號、結(jié)束行號,轉(zhuǎn)換行數(shù)、列數(shù)
    first_col = rng.column: last_row = rng.Rows.Count
    resize_r = rng.Rows.Count - title_row: resize_c = rng.Columns.Count: r = resize_c / num_col
    If resize_c Mod num_col <> 0 Then Debug.Print "選中列數(shù)不可平分": Exit Sub
    
    With ActiveSheet
        For i = last_row To title_row + 1 Step -1  '倒序循環(huán)
            keep_rng = .Cells(i, 1).Resize(1, first_col - 1)  '不變區(qū)域
            arr = .Cells(i, first_col).Resize(1, resize_c)    '轉(zhuǎn)換區(qū)域
            arr = wraparr(arr, "row", r)  '調(diào)用函數(shù)將arr轉(zhuǎn)換為r行num_col的數(shù)組
            .Cells(i + 1, 1).Resize(r - 1, 1).EntireRow.Insert  '插入行
            .Cells(i, 1).Resize(r, first_col - 1) = keep_rng
            .Cells(i, first_col).Resize(r, num_col) = arr
        Next
        If del_empty Then  '刪除空行
            j = (last_row - title_row) * r + title_row  '總行數(shù)
            For i = title_row + 1 To j
                brr = .Cells(i, first_col).Resize(1, num_col)
                If num_col > 1 Then  'brr是否為數(shù)組
                    b = Join(WorksheetFunction.Transpose(WorksheetFunction.Transpose(brr)), "")
                ElseIf num_col = 1 Then
                    b = brr
                End If
                If Len(b) = 0 Then
                    If del_rng Is Nothing Then
                        Set del_rng = .Rows(i)
                    Else
                        Set del_rng = Union(del_rng, .Rows(i))
                    End If
                End If
            Next
            If Not del_rng Is Nothing Then del_rng.Delete  '刪除行
        End If
        .Cells(1, first_col + num_col).Resize(1, resize_c - num_col).EntireColumn.Delete  '刪除選中列
    End With
End Sub
轉(zhuǎn)換結(jié)果

本文圖1(轉(zhuǎn)換前不含7-20行),選中 B:M 列,運行代碼得到如下圖結(jié)果: D:M 列被刪除
Excel·VBA表格橫向、縱向相互轉(zhuǎn)換,excel,vba,excel,vba,橫向轉(zhuǎn)換,縱向轉(zhuǎn)換

縱向轉(zhuǎn)橫向

使用自定義函數(shù)轉(zhuǎn)換,具體說明見注釋(key_col(0)為開始列號,之前的都為字典鍵,之后的都為待轉(zhuǎn)換數(shù)據(jù))

Function 縱向轉(zhuǎn)橫向(ByVal data_arr, ByVal key_col)  '按非key_col列為鍵橫向合并數(shù)組
    '轉(zhuǎn)換函數(shù),arr為待轉(zhuǎn)換數(shù)組(從1開始計數(shù)二維數(shù)組),key_col為列號數(shù)組(從0開始計數(shù)一維數(shù)組)
    '返回結(jié)果,從1開始計數(shù)二維數(shù)組;key_col(0)為開始列號,key_col(1)為結(jié)束列號,鍵在開始列號之前
    Dim dict As Object, num_col&, delimiter$, i&, j&, r&, c&, k$, max_c&, rr&, cc&
    If Not IsArray(data_arr) Or Not IsArray(key_col) Then Debug.Print "錯誤!參數(shù)都為數(shù)組": Exit Function
    Set dict = CreateObject("scripting.dictionary")
    num_col = key_col(1) - key_col(0) + 1: delimiter = Chr(28)  '分隔符
    ReDim res(1 To UBound(data_arr), 1 To UBound(data_arr) * num_col)
    
    For i = LBound(data_arr) To UBound(data_arr)
        k = ""
        For j = 1 To key_col(0) - 1
            k = k & delimiter & data_arr(i, j)
        Next
        If Not dict.Exists(k) Then
            r = r + 1: dict(k) = Array(r, key_col(0))
            For j = 1 To key_col(0) - 1
                res(r, j) = data_arr(i, j)
            Next
        Else
            c = dict(k)(1) + num_col: dict(k) = Array(dict(k)(0), c)
            max_c = WorksheetFunction.Max(max_c, c)  '最大列數(shù)
        End If
        rr = dict(k)(0): cc = dict(k)(1) - 1
        For j = key_col(0) To key_col(1)
            cc = cc + 1: res(rr, cc) = data_arr(i, j)
        Next
    Next
    ReDim result(1 To r, 1 To max_c + num_col - 1)  '去除res數(shù)組多余部分
    For i = 1 To UBound(result)
        For j = 1 To UBound(result, 2)
            result(i, j) = res(i, j)
        Next
    Next
    縱向轉(zhuǎn)橫向 = result
End Function

轉(zhuǎn)換結(jié)果

對“橫向轉(zhuǎn)縱向”無論是方法1還是方法2,生成的結(jié)果進行如下轉(zhuǎn)換,生成的“縱向轉(zhuǎn)橫向”結(jié)果都一致,如下圖

Sub 表格縱向轉(zhuǎn)橫向()
    Dim arr, brr
    arr = [a2:c20]: brr = 縱向轉(zhuǎn)橫向(arr, Array(2, 3))
    [d1].Resize(UBound(brr), UBound(brr, 2)) = brr
End Sub

Excel·VBA表格橫向、縱向相互轉(zhuǎn)換,excel,vba,excel,vba,橫向轉(zhuǎn)換,縱向轉(zhuǎn)換
多列鍵也可使用自定義函數(shù)轉(zhuǎn)換,更具通用性

Sub 表格縱向轉(zhuǎn)橫向()
    Dim arr, brr
    arr = [a2:d20]: brr = 縱向轉(zhuǎn)橫向(arr, Array(3, 4))
    [f1].Resize(UBound(brr), UBound(brr, 2)) = brr
End Sub

Excel·VBA表格橫向、縱向相互轉(zhuǎn)換,excel,vba,excel,vba,橫向轉(zhuǎn)換,縱向轉(zhuǎn)換
附件:《Excel·VBA表格橫向、縱向相互轉(zhuǎn)換(附件)》

擴展閱讀:
《excelhome-多列轉(zhuǎn)3列》
《excel吧-3列轉(zhuǎn)多列》文章來源地址http://www.zghlxwxcb.cn/news/detail-624980.html

到了這里,關(guān)于Excel·VBA表格橫向、縱向相互轉(zhuǎn)換的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • EXCEL VBA從入門到精通 第九章:Excel VBA高級編程技巧

    介紹Excel VBA中的API編程,以及如何利用它們來訪問Windows系統(tǒng)的功能。 Excel VBA提供了訪問Windows系統(tǒng)API的功能,通過調(diào)用API函數(shù)可以訪問Windows系統(tǒng)底層的功能和資源,例如操作系統(tǒng)、文件系統(tǒng)、網(wǎng)絡(luò)、注冊表等。API函數(shù)可以是Windows操作系統(tǒng)內(nèi)置的函數(shù),也可以是Windows DLL文件中

    2024年02月02日
    瀏覽(25)
  • EXCEL VBA從入門到精通 第一章:VBA入門

    介紹VBA的定義,作用和優(yōu)點。 VBA(Visual Basic for Applications)是一種編程語言,是微軟Office套件中的一個重要組成部分,主要用于自動化處理Office中的各種操作,包括Excel、Word、PowerPoint、Outlook等。 VBA是一種基于VB(Visual Basic)語言的編程語言,它具有簡單易學(xué)、功能強大、靈

    2024年02月07日
    瀏覽(28)
  • 掌握 Microsoft Excel 宏和 Excel VBA

    掌握 Microsoft Excel 宏和 Excel VBA

    掌握 Microsoft Excel 宏和 Excel VBA 基于項目的 Excel VBA(Visual Basic for Applications)和 Excel 宏課程 課程英文名:Master Microsoft Excel Macros and Excel VBA 此視頻教程共27.0小時,中英雙語字幕,畫質(zhì)清晰無水印,源碼附件全 課程編號:286 百度網(wǎng)盤地址:https://pan.baidu.com/s/1ivLIGKt_3R0wncmCswMTR

    2024年02月05日
    瀏覽(22)
  • Excel+VBA幫助

    ?目錄 一、VBA 入門知識 1、激活工作簿 2、創(chuàng)建新工作簿 3、打開工作簿 4、用編號引用工作表 5、用名稱引用工作表 6、將文檔保存為 Web 頁 7、用 A1 樣式的記號引用單元格和單元格區(qū)域 8、用編號引用單元格 9、引用行或列 10、用快捷記號引用單元格 11、引用命名單元格區(qū)域

    2024年02月05日
    瀏覽(18)
  • Excel VBA 語法基礎(chǔ)

    VBA(Visual Basic for Applications)是一種用于宏編程和自動化任務(wù)的編程語言,廣泛應(yīng)用于 Microsoft Office 套件中的各種應(yīng)用程序,如 Excel、Word 和 PowerPoint。掌握 VBA 基礎(chǔ)語法可以幫助您通過編寫自定義的宏來增強和自動化這些應(yīng)用程序的功能。 本文將介紹 Excel VBA 的基礎(chǔ)語法,幫

    2024年02月09日
    瀏覽(27)
  • 【一】Excel VBA開發(fā) 初探

    【一】Excel VBA開發(fā) 初探

    1、點擊Excel左上角的【文件】,然后點擊文件下方的【選項】 2、【Excel選項】中點擊【自定義功能區(qū)】,右邊勾選【開發(fā)工具】,點擊【確定】 ?3、返回excel sheet 頁面。點擊【開發(fā)工具】,我們將看到三個我們開發(fā)過程中必用的按鈕,分別是:【Visual Basic】、【宏】、【錄制

    2024年02月11日
    瀏覽(23)
  • VBA技術(shù)資料MF36:VBA_在Excel中排序

    VBA技術(shù)資料MF36:VBA_在Excel中排序

    【分享成果,隨喜正能量】一個人的氣質(zhì),并不在容顏和身材,而是所經(jīng)歷過的往事,是內(nèi)在留下的印跡,令人深沉而安謐。所以,優(yōu)雅是一種閱歷的凝聚;淡然是一段人生的沉淀。時間會讓一顆靈魂,變得越來越動人??刂谱约旱钠?,做一個有修養(yǎng)的人。。 我給VBA的定義

    2024年02月15日
    瀏覽(30)
  • VBA技術(shù)資料MF43:VBA_Excel中自動填充

    VBA技術(shù)資料MF43:VBA_Excel中自動填充

    【分享成果,隨喜正能量】以時寢息,當愿眾生,身得安隱,心無動亂。愿我們都能,夢見幸福!在踉蹌中前進,在跌倒后躍進,逐漸強大.。 我給VBA的定義:VBA是個人小型自動化處理的有效工具。利用好了,可以大大提高自己的工作效率,而且可以提高數(shù)據(jù)的準確度。我的

    2024年02月12日
    瀏覽(28)
  • VBA技術(shù)資料MF35:VBA_在Excel中過濾數(shù)據(jù)

    VBA技術(shù)資料MF35:VBA_在Excel中過濾數(shù)據(jù)

    【分享成果,隨喜正能量】好馬好在腿,好人好在嘴。不會燒香得罪神,不會講話得罪人。慢慢的你就會發(fā)現(xiàn),一顆好心,永遠比不上一張好嘴。。 我給VBA的定義:VBA是個人小型自動化處理的有效工具。利用好了,可以大大提高自己的工作效率,而且可以提高數(shù)據(jù)的準確度。

    2024年02月14日
    瀏覽(26)
  • Excel·VBA合并工作簿2

    Excel·VBA合并工作簿2

    其他合并工作簿的方法,見之前的文章《Excel·VBA合并工作簿》 與之前的文章《Excel·VBA合并工作簿(3,合并文件夾下所有工作簿中所有工作表)》類似,但是按照表頭名稱,將表格數(shù)據(jù)匯總至合并表格,表頭名稱相同的在同一列 舉例 共5個工作簿13個工作表,并且改變了C、

    2024年01月21日
    瀏覽(49)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包