Chia bảng tính excel 2010 thành nhiều tệp sổ làm việc dựa trên giá trị cột


1

Tôi tìm và xóa rất nhiều dữ liệu liên hệ, được sắp xếp theo quốc gia mà tôi hiện đang sử dụng excel để quản lý. Chủ yếu là vì việc dọn dẹp và thao tác dữ liệu tôi tìm thấy theo cách này dễ dàng hơn và tôi có thể dễ dàng chia sẻ dữ liệu của từng quốc gia với các đồng nghiệp của mình. Hiện tại có nhiều sổ làm việc được tổ chức theo quốc gia (vì chúng tôi có tổng cộng khoảng 280.000 liên hệ và có chúng trong một sổ làm việc là không hiệu quả).

Vì vậy, cấu trúc thư mục là

Argentina
Australia
Austria
etc...

Mỗi bảng chứa một bảng tính được gọi là

tên quốc gia.xlsx

Tôi có một bảng tính 'bảng điều khiển' khác báo cáo tổng số từ mỗi sổ làm việc riêng lẻ cùng với tổng số phân đoạn liên hệ.

Định dạng cho sổ làm việc là một cái gì đó dọc theo dòng

Úc.xls

Country          Department      Name            Email               Telephone          
Australia        Finance         John Doe        test@test1.com      07..
Australia        Admin           Jane Doe        test@test2.com      07..
Australia        Sales           Bill Pond       test@test3.com      07..
etc...

Có khoảng 28 mô tả cột.

Những gì tôi muốn xảy ra là có một bảng tính, nói:

Workinprowards.xlsx

Và khi tôi thêm dữ liệu vào đây, nó sẽ tự động được thêm vào sổ làm việc của mỗi quốc gia sau khi được lưu, bảo toàn tất cả các cột. Sau đó tôi có thể xóa sạch nó và bắt đầu làm mới mỗi ngày khi biết dữ liệu đang được lưu trữ theo quốc gia.

Có bất kỳ chức năng nào có thể làm điều này tự động trong Excel 2010 không, hoặc điều này sẽ yêu cầu VBA (như tôi nghi ngờ nó sẽ làm)?


4
Nó sẽ đòi hỏi rất nhiều VBA. Có vẻ như nếu bạn định đầu tư thời gian để làm việc này, có thể tốt hơn để chuyển đổi toàn bộ sang Cơ sở dữ liệu. Dễ dàng phát triển hơn (hoặc lớn hơn với> 280k hồ sơ) và dễ dàng hơn để duy trì và gửi báo cáo từ đó.
guitarthrower

Tôi đồng ý, ngay cả một cơ sở dữ liệu Access sẽ tốt hơn excel cho một cái gì đó thuộc về bản chất này.
Raystafarian

Báo lại ý kiến ​​của người khác. Bạn đang mô tả chức năng tích hợp của Access với một biểu mẫu trên đầu trang. Ít nhất, một giải pháp lai trong đó cấu trúc thư mục và sổ làm việc của bạn là các bảng cơ sở dữ liệu và workinproTHER.xlsx của bạn có một số VBA để cập nhật các bảng. Bạn có thể đấu tranh với việc thực hiện giải pháp đó nếu bạn thiếu kinh nghiệm DB, nhưng VBA cần thiết để lấy những gì bạn muốn với cấu trúc thư mục sẽ là nguyên nhân tồn tại của bạn. Nguyên nhân của sự tồn tại của bạn
JNevill 17/03/2016

Câu trả lời:


1

Tôi biết điều này là cũ, nhưng như một tài liệu tham khảo:

Option Explicit

Private Const Q         As String = "'"
Private Const ROOT      As String = "E:\Test\"
Private Const FLDR      As String = "SubFolder"
Private Const DASHBRD   As String = "Db.xlsx"

Public Sub updateAllFiles()
    Dim ws As Worksheet, cn As ADODB.Connection, rs As ADODB.Recordset, sql As String
    Dim fs As Variant, updateVals As String, rng As Range, allFiles As Long, i As Long
    Dim fld As Variant, cName As String

    fs = fileListFSO    'fileListXL
    allFiles = UBound(fs)
    If allFiles > -1 Then
        Set ws = Worksheets(1)
        Set rng = ws.UsedRange.Rows(ws.UsedRange.Rows.Count)

        rng.Replace Q, """" 'remove single quotes (')
        updateVals = Join(Application.Transpose(Application.Transpose(rng)), Q & "," & Q)
        updateVals = Replace(Replace(updateVals, "[", vbNullString), "]", vbNullString)
        updateVals = Q & updateVals & Q
        Set cn = New ADODB.Connection: Set rs = New ADODB.Recordset

        For i = 0 To allFiles
            cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=" & fs(i) & ";" & _
                    "Extended Properties=""Excel 12.0"";"

            sql = "Select * From [Sheet1$]"
            rs.Open sql, cn, adOpenStatic, adLockReadOnly, adCmdText: rs.Close

            sql = "INSERT INTO [Sheet1$] Values " & "(" & updateVals & ")"
            rs.Open sql, cn, adOpenStatic, adLockReadOnly, adCmdText: cn.Close
        Next
        Set rs = Nothing: Set cn = Nothing
    End If
End Sub

.

Các hàm này trả về mảng 1 chiều với tên tệp đủ điều kiện (đường dẫn đầy đủ)

Private Function fileListFSO(Optional ByVal fldrPath As String = ROOT & FLDR) As Variant
    Dim fso As Variant, FLDR As Variant, f As Variant, result As Variant
    If Len(Dir(fldrPath, vbDirectory)) > 0 Then
        Set fso = CreateObject("Scripting.FileSystemObject")
        Set FLDR = fso.GetFolder(fldrPath)
        For Each f In FLDR.Files
            If InStr(f.Name, "~$") = 0 And InStr(f.Name, ".xlsm") = 0 Then
                result = result & f.Path & ","
            End If
        Next
        fileListFSO = Split(Left(result, Len(result) - 1), ",")
    End If
End Function



Private Function fileListXL(Optional ByVal xlFile As String = ROOT & DASHBRD) As Variant
    Dim wb As Workbook, ws As Worksheet, result As Variant
    If Len(Dir(xlFile)) > 0 Then
        Set wb = Workbooks.Open(Filename:=xlFile, ReadOnly:=True)
        Set ws = wb.Worksheets(1)
        result = Join(Application.Transpose(ws.UsedRange.Columns(1)), ",")  'col to str
        fileListXL = Split(result, ",")                                     'str to arr
        wb.Close
    End If
End Function

.

Đang cập nhật tệp:

cập nhật Đóng WB 1

Kiểm tra tập tin:

cập nhật Đóng WB 4 - Tệp

Kiểm tra tệp - Trước:

cập nhật Đóng WB 2 - Trước

Kiểm tra tệp - Sau:

cập nhật Đóng WB 3 - Sau

.

Ghi chú:

  • Tất cả các tệp được cập nhật phải nằm trong cùng một thư mục
  • Tất cả các tệp (bao gồm trình cập nhật) phải có cùng định dạng (cùng số lượng cột)
  • Tất cả các tệp được cập nhật (bao gồm trình cập nhật) phải có dữ liệu trên trang tính đầu tiên, được đặt tên là "Trang tính 1"
  • Tất cả các tệp được cập nhật phải có dữ liệu được định dạng là Văn bản (đối với câu lệnh Chèn ADO)
  • Tệp DashBoard (db.xlsx) phải có danh sách tất cả các tệp trong cột A, trên một trang có tên "Sheet1"

    • Tất cả các tệp phải bao gồm đường dẫn đầy đủ

1
Thật tuyệt khi thấy SQL trong VBA. Nhưng tôi chưa hiểu ví dụ của bạn. Người dùng chọn nơi XLS đích mà bản ghi sẽ đi đâu? Một cái gì đó giống như tên quốc gia hoặc trong ví dụ Book1 của bạn . Ồ, và +1 là mức tối thiểu cho nỗ lực của bạn
nixda

Cảm ơn @nixda - Tôi đã thực hiện nó như một bài tập và tập trung vào cách thực hiện cập nhật hàng loạt. Mã này cung cấp 2 cách để nhận danh sách các tệp sẽ được cập nhật, một cách với FSO (sử dụng ROOT và FLDR) và cách khác bằng cách đọc danh sách từ tệp bảng điều khiển "Trang tính 1", cột A (bao gồm các đường dẫn đầy đủ). Nó có thể được cập nhật để sử dụng hộp thoại cho thư mục nguồn và tệp bảng điều khiển và cũng cập nhật đệ quy tất cả các thư mục con. Hiện tại, nó giả định rằng tất cả các tệp có "Trang tính 1" (được mã hóa cứng) và sẽ đọc và cập nhật bản ghi cuối cùng trong tất cả các tệp.
paul bica
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.