Hướng dẫn convert excel macro to python - chuyển macro excel sang python

Tất cả mọi thứ bạn có thể viết trong VBA đều có thể được thực hiện bằng Python. Trang này chứa thông tin sẽ giúp bạn dịch mã VBA của bạn thành Python.

Xin lưu ý rằng mô hình đối tượng Excel là một phần của Excel và được Microsoft ghi lại. Các lớp và phương thức từ API đó được sử dụng trong tài liệu này không phải là một phần của pyxll, và vì vậy vui lòng tham khảo tài liệu mô hình đối tượng Excel để biết thêm chi tiết về việc sử dụng chúng.

Xem thêm các chức năng vĩ mô.Macro Functions.

Mô hình đối tượng Excel & NBSP; ¶

Khi lập trình trong VBA, bạn tương tác với mô hình đối tượng Excel. Ví dụ, khi viết

Sub Macro1()
    Range("B11:K11").Select
EndSub

Những gì bạn đang làm là xây dựng một đối tượng phạm vi và gọi phương thức chọn trên đó. Đối tượng phạm vi là một phần của mô hình đối tượng Excel.

Hầu hết những gì mọi người nói đến liên quan đến VBA trong Excel thực sự là mô hình đối tượng Excel, thay vì chính ngôn ngữ VBA. Khi bạn hiểu cách tương tác với mô hình đối tượng Excel từ Python, sau đó thay thế mã VBA của bạn bằng mã Python trở nên đơn giản.

Mô hình đối tượng Excel được Microsoft ghi lại rõ ràng như là một phần của tài liệu tham khảo VBA Office.

Những người vượt rào đầu tiên thường phải đối mặt khi bắt đầu viết các macro Excel trong Python là tìm tài liệu cho các lớp Python Excel. Khi bạn nhận ra rằng mô hình đối tượng giống nhau trên Python và VBA, bạn sẽ thấy rằng các lớp được ghi lại trong tài liệu tham khảo VBA của Office là cùng một lớp mà bạn sử dụng từ Python và vì vậy bạn có thể sử dụng cùng một tài liệu mặc dù mã ví dụ Có thể được viết bằng VBA.

Truy cập mô hình đối tượng Excel trong Python & NBSP; ¶

Mô hình đối tượng Excel được cung cấp cho tất cả các ngôn ngữ bằng com. Python có một vài gói khiến giao diện COM rất dễ dàng. Nếu bạn không biết gì về COM thì ở đó, không cần phải lo lắng vì bạn không cần phải gọi API COM Excel từ Python.

Đối tượng cấp cao nhất trong mô hình đối tượng Excel là đối tượng ứng dụng. Điều này thể hiện ứng dụng Excel và tất cả các đối tượng khác được truy cập thông qua đối tượng này.

PYXLL cung cấp chức năng trợ giúp,

from pyxll import xl_macro, xl_app


@xl_macro
def macro1():
    xl = xl_app()

    # 'xl' is an instance of the Excel.Application object

    # Get the current ActiveSheet (same as in VBA)
    sheet = xl.ActiveSheet

    # Call the 'Range' method on the Sheet
    xl_range = sheet.Range('B11:K11')

    # Call the 'Select' method on the Range.
    # Note the parentheses which are not required in VBA but are in Python.
    xl_range.Select()
7, để truy xuất đối tượng ứng dụng Excel. Theo mặc định, nó sử dụng gói Python
from pyxll import xl_macro, xl_app


@xl_macro
def macro1():
    xl = xl_app()

    # 'xl' is an instance of the Excel.Application object

    # Get the current ActiveSheet (same as in VBA)
    sheet = xl.ActiveSheet

    # Call the 'Range' method on the Sheet
    xl_range = sheet.Range('B11:K11')

    # Call the 'Select' method on the Range.
    # Note the parentheses which are not required in VBA but are in Python.
    xl_range.Select()
8, là một phần của gói
from pyxll import xl_macro, xl_app


@xl_macro
def macro1():
    xl = xl_app()

    # 'xl' is an instance of the Excel.Application object

    # Get the current ActiveSheet (same as in VBA)
    sheet = xl.ActiveSheet

    # Call the 'Range' method on the Sheet
    xl_range = sheet.Range('B11:K11')

    # Call the 'Select' method on the Range.
    # Note the parentheses which are not required in VBA but are in Python.
    xl_range.Select()
9 [1].

Nếu bạn đã cài đặt gói

from pyxll import xl_macro, xl_app


@xl_macro
def macro1():
    xl = xl_app()

    # 'xl' is an instance of the Excel.Application object

    # Get the current ActiveSheet (same as in VBA)
    sheet = xl.ActiveSheet

    # Call the 'Range' method on the Sheet
    xl_range = sheet.Range('B11:K11')

    # Call the 'Select' method on the Range.
    # Note the parentheses which are not required in VBA but are in Python.
    xl_range.Select()
9, bạn có thể làm như vậy bằng cách sử dụng
from win32com.client.gencache import EnsureDispatch

# Get the first open Excel.Application found, or launch a new one
xl = EnsureDispatch('Excel.Application')
1:

Hoặc nếu bạn đang sử dụng Anaconda, bạn có thể sử dụng

from win32com.client.gencache import EnsureDispatch

# Get the first open Excel.Application found, or launch a new one
xl = EnsureDispatch('Excel.Application')
2:

Bạn có thể sử dụng

from pyxll import xl_macro, xl_app


@xl_macro
def macro1():
    xl = xl_app()

    # 'xl' is an instance of the Excel.Application object

    # Get the current ActiveSheet (same as in VBA)
    sheet = xl.ActiveSheet

    # Call the 'Range' method on the Sheet
    xl_range = sheet.Range('B11:K11')

    # Call the 'Select' method on the Range.
    # Note the parentheses which are not required in VBA but are in Python.
    xl_range.Select()
7 để truy cập đối tượng ứng dụng Excel từ macro Excel. Ví dụ sau đây cho thấy cách viết lại mẫu mã VBA
from win32com.client.gencache import EnsureDispatch

# Get the first open Excel.Application found, or launch a new one
xl = EnsureDispatch('Excel.Application')
4 từ phần trên.

Lưu ý rằng trong VBA có một đối tượng ngầm, liên quan đến nơi VBA Sub (Macro) được viết. Thông thường, mã VBA được viết trực tiếp trên một tờ và trang tính được ngụ ý trong các cuộc gọi khác nhau. Trong ví dụ

from win32com.client.gencache import EnsureDispatch

# Get the first open Excel.Application found, or launch a new one
xl = EnsureDispatch('Excel.Application')
4 ở trên,
from win32com.client.gencache import EnsureDispatch

# Get the first open Excel.Application found, or launch a new one
xl = EnsureDispatch('Excel.Application')
6 thực sự là một phương thức trên trang tính mà macro được viết trên. Trong Python, chúng ta cần phải nhận rõ ràng tờ hoạt động hiện tại.

from pyxll import xl_macro, xl_app


@xl_macro
def macro1():
    xl = xl_app()

    # 'xl' is an instance of the Excel.Application object

    # Get the current ActiveSheet (same as in VBA)
    sheet = xl.ActiveSheet

    # Call the 'Range' method on the Sheet
    xl_range = sheet.Range('B11:K11')

    # Call the 'Select' method on the Range.
    # Note the parentheses which are not required in VBA but are in Python.
    xl_range.Select()

Bạn có thể gọi vào Excel bằng mô hình đối tượng Excel từ các hàm macro và menu và sử dụng một bộ phụ của chức năng Excel từ các chức năng bảng tính, nơi phải cẩn thận hơn vì các chức năng được gọi trong quá trình tính toán Excel.

Bạn có thể xóa các hạn chế này bằng cách gọi hàm pyxll

from win32com.client.gencache import EnsureDispatch

# Get the first open Excel.Application found, or launch a new one
xl = EnsureDispatch('Excel.Application')
7 để lên lịch chức năng Python để được gọi theo cách cho phép bạn sử dụng mô hình đối tượng Excel một cách an toàn. Ví dụ: không thể cập nhật các giá trị ô bảng tính từ hàm bảng tính, nhưng có thể sắp xếp một cuộc gọi bằng cách sử dụng
from win32com.client.gencache import EnsureDispatch

# Get the first open Excel.Application found, or launch a new one
xl = EnsureDispatch('Excel.Application')
7 và cập nhật cuộc gọi đó sau khi Excel hoàn thành tính toán.

Để thử nghiệm, nó cũng có thể hữu ích khi gọi vào Excel từ dấu nhắc Python (hoặc một cuốn sổ tay Jupyter). Điều này cũng có thể được thực hiện bằng cách sử dụng

from pyxll import xl_macro, xl_app


@xl_macro
def macro1():
    xl = xl_app()

    # 'xl' is an instance of the Excel.Application object

    # Get the current ActiveSheet (same as in VBA)
    sheet = xl.ActiveSheet

    # Call the 'Range' method on the Sheet
    xl_range = sheet.Range('B11:K11')

    # Call the 'Select' method on the Range.
    # Note the parentheses which are not required in VBA but are in Python.
    xl_range.Select()
7, và trong trường hợp đó, phiên bản Excel mở đầu tiên được tìm thấy sẽ được trả về.

Bạn có thể thử điều này bằng cách sử dụng

from pyxll import xl_macro, xl_app


@xl_macro
def macro1():
    xl = xl_app()

    # 'xl' is an instance of the Excel.Application object

    # Get the current ActiveSheet (same as in VBA)
    sheet = xl.ActiveSheet

    # Call the 'Range' method on the Sheet
    xl_range = sheet.Range('B11:K11')

    # Call the 'Select' method on the Range.
    # Note the parentheses which are not required in VBA but are in Python.
    xl_range.Select()
8 trực tiếp thay vì
from pyxll import xl_macro, xl_app


@xl_macro
def macro1():
    xl = xl_app()

    # 'xl' is an instance of the Excel.Application object

    # Get the current ActiveSheet (same as in VBA)
    sheet = xl.ActiveSheet

    # Call the 'Range' method on the Sheet
    xl_range = sheet.Range('B11:K11')

    # Call the 'Select' method on the Range.
    # Note the parentheses which are not required in VBA but are in Python.
    xl_range.Select()
7. Tuy nhiên, chúng tôi không khuyên điều này khi gọi mã Python của bạn từ Excel, vì nó có thể trả về một trường hợp Excel khác với mã bạn mong đợi.

from win32com.client.gencache import EnsureDispatch

# Get the first open Excel.Application found, or launch a new one
xl = EnsureDispatch('Excel.Application')

Sự khác biệt giữa VBA và Python & NBSP; ¶

Độ nhạy của trường hợp & nbsp; ¶

Python là trường hợp nhạy cảm. Điều này có nghĩa là các đoạn mã như

' Select is a method and is called without parentheses in VBA
Range("B11:K11").Select
2 và
' Select is a method and is called without parentheses in VBA
Range("B11:K11").Select
3 là khác nhau (lưu ý vốn
' Select is a method and is called without parentheses in VBA
Range("B11:K11").Select
4 trong trường hợp đầu tiên. Ở VBA, chúng sẽ được đối xử giống nhau, nhưng trong Python, bạn phải chú ý đến trường hợp bạn sử dụng trong mã của mình.

Nếu một cái gì đó không hoạt động như mong đợi, hãy kiểm tra tệp nhật ký Pyxll. Bất kỳ trường hợp ngoại lệ chưa học nào cũng sẽ được ghi lại ở đó và nếu bạn đã cố gắng truy cập vào một tài sản bằng cách sử dụng trường hợp sai thì bạn có thể sẽ thấy một ngoại lệ

' Select is a method and is called without parentheses in VBA
Range("B11:K11").Select
5.

Gọi các phương thức & nbsp; ¶

Trong Python, dấu ngoặc đơn (

' Select is a method and is called without parentheses in VBA
Range("B11:K11").Select
6) luôn được sử dụng khi gọi phương thức. Trong VBA, họ có thể bị bỏ qua. Việc bỏ qua việc thêm dấu ngoặc đơn vào Python sẽ dẫn đến phương thức không được gọi, vì vậy, điều quan trọng là phải nhận thức được các thuộc tính lớp nào là phương thức (và do đó phải được gọi) và là các thuộc tính (có giá trị có sẵn theo tham chiếu).always used when calling a method. In VBA, they may be omitted. Neglecting to add parentheses in Python will result in the method not being called, so it’s important to be aware of which class attributes are methods (and must therefore be called) and which are properties (whose values are available by reference).

Ví dụ, phương pháp

' Select is a method and is called without parentheses in VBA
Range("B11:K11").Select
7 trên loại
from win32com.client.gencache import EnsureDispatch

# Get the first open Excel.Application found, or launch a new one
xl = EnsureDispatch('Excel.Application')
6 là một phương thức và do đó phải được gọi với dấu ngoặc đơn trong Python, nhưng trong VBA chúng có thể, và thường được bỏ qua.

' Select is a method and is called without parentheses in VBA
Range("B11:K11").Select

from pyxll import xl_app
xl = xl_app()

# In Python, the parentheses are necessary to call the method
xl.Range('B11:K11').Select()

Các đối số từ khóa có thể được truyền trong cả VBA và Python, nhưng trong các đối số từ khóa Python sử dụng

' Select is a method and is called without parentheses in VBA
Range("B11:K11").Select
9 thay vì
from pyxll import xl_app
xl = xl_app()

# In Python, the parentheses are necessary to call the method
xl.Range('B11:K11').Select()
0 được sử dụng trong VBA.

Truy cập các thuộc tính không yêu cầu dấu ngoặc đơn, và làm như vậy sẽ cho kết quả bất ngờ! Ví dụ: thuộc tính

from pyxll import xl_app
xl = xl_app()

# In Python, the parentheses are necessary to call the method
xl.Range('B11:K11').Select()
1 sẽ trả về giá trị của phạm vi. Thêm
' Select is a method and is called without parentheses in VBA
Range("B11:K11").Select
6 vào nó sẽ cố gắng gọi giá trị đó và vì giá trị sẽ không được gọi, nó sẽ dẫn đến lỗi.

from pyxll import xl_app
xl = xl_app()

# Value is a property and so no parentheses are used
value = xl.Range('B11:K11').Value

Các đối số được đặt tên & nbsp; ¶

Trong VBA, các đối số được đặt tên được truyền bằng

from pyxll import xl_app
xl = xl_app()

# In Python, the parentheses are necessary to call the method
xl.Range('B11:K11').Select()
3. Trong Python, cú pháp hơi khác nhau và chỉ sử dụng dấu hiệu bằng. Một điểm khác biệt quan trọng khác là VBA không nhạy cảm với trường hợp mà là Python. Điều này áp dụng cho tên đối số cũng như tên phương thức và thuộc tính.

Trong VBA, bạn có thể viết

Set myRange = Application.InputBox(prompt := "Sample", type := 8)

Nếu bạn nhìn vào tài liệu cho application.InputBox, bạn sẽ thấy rằng các tên đối số được đặt khác với điều này và thực sự là ’nhắc nhở và‘ gõ. Trong Python, bạn có thể thoát khỏi việc nhận trường hợp sai như bạn có thể ở VBA.

Trong Python, phương pháp tương tự này sẽ được gọi là

from pyxll import xl_app
xl = xl_app()

my_range = xl.InputBox(Prompt='Sample', Type=8)

Thuộc tính & NBSP; ¶

Cả VBA và Python đều hỗ trợ các thuộc tính. Truy cập một thuộc tính từ một đối tượng là tương tự nhau trong cả hai ngôn ngữ. Ví dụ: để tìm nạp thuộc tính ActiveSheet từ đối tượng ứng dụng, bạn sẽ làm như sau trong VBA:

Set mySheet = Application.ActiveSheet

Trong Python, cú pháp được sử dụng giống hệt nhau:

from pyxll import xl_app
xl = xl_app()

my_sheet = xl.ActiveSheet

Thuộc tính với đối số & nbsp; ¶

Trong VBA, sự khác biệt giữa các phương thức và thuộc tính có phần bị mờ khi các thuộc tính trong VBA có thể có các đối số. Trong Python, một tài sản không bao giờ có lập luận. Để hiểu được sự khác biệt này, các lớp excel

from pyxll import xl_macro, xl_app


@xl_macro
def macro1():
    xl = xl_app()

    # 'xl' is an instance of the Excel.Application object

    # Get the current ActiveSheet (same as in VBA)
    sheet = xl.ActiveSheet

    # Call the 'Range' method on the Sheet
    xl_range = sheet.Range('B11:K11')

    # Call the 'Select' method on the Range.
    # Note the parentheses which are not required in VBA but are in Python.
    xl_range.Select()
8 đã nhận và đặt các phương thức cho các thuộc tính có các đối số, ngoài tài sản.

Thuộc tính phạm vi.offset là một ví dụ về một thuộc tính lấy các đối số tùy chọn. Nếu được gọi là không có đối số, nó chỉ đơn giản là trả về cùng một đối tượng phạm vi. Để gọi nó với các đối số trong Python, phương thức Getoffset phải được sử dụng thay vì thuộc tính bù.

Mã sau đây kích hoạt ba cột ở bên phải và ba hàng xuống từ ô hoạt động trên Sheet1:

from pyxll import xl_macro, xl_app


@xl_macro
def macro1():
    xl = xl_app()

    # 'xl' is an instance of the Excel.Application object

    # Get the current ActiveSheet (same as in VBA)
    sheet = xl.ActiveSheet

    # Call the 'Range' method on the Sheet
    xl_range = sheet.Range('B11:K11')

    # Call the 'Select' method on the Range.
    # Note the parentheses which are not required in VBA but are in Python.
    xl_range.Select()
0

Để chuyển đổi điều này thành Python, chúng ta phải thực hiện các thay đổi sau:

  • Thay thế thuộc tính Offset bằng phương thức Getoffset để vượt qua Arguemnts.
  • Thay thế Rowoffset và cột OfferSet Rowoffset và cột OfferSet như được chỉ định trong tài liệu Range.Offset.
  • Gọi phương thức kích hoạt bằng cách thêm dấu ngoặc đơn ở cả hai nơi mà nó sử dụng.

from pyxll import xl_macro, xl_app


@xl_macro
def macro1():
    xl = xl_app()

    # 'xl' is an instance of the Excel.Application object

    # Get the current ActiveSheet (same as in VBA)
    sheet = xl.ActiveSheet

    # Call the 'Range' method on the Sheet
    xl_range = sheet.Range('B11:K11')

    # Call the 'Select' method on the Range.
    # Note the parentheses which are not required in VBA but are in Python.
    xl_range.Select()
1

Ghi chú

Bạn có thể tự hỏi, điều gì sẽ xảy ra nếu bạn sử dụng thuộc tính Offset trong Python? Như bạn có thể mong đợi, nó sẽ thất bại - nhưng có lẽ không theo cách bạn có thể nghĩ.

Nếu bạn gọi

from pyxll import xl_app
xl = xl_app()

# In Python, the parentheses are necessary to call the method
xl.Range('B11:K11').Select()
5, kết quả sẽ là tham số Rowoffset không hợp lệ. Những gì thực sự xảy ra là khi
from pyxll import xl_app
xl = xl_app()

# In Python, the parentheses are necessary to call the method
xl.Range('B11:K11').Select()
6 được đánh giá, thuộc tính Offset trả về một phạm vi tương đương với ActiveCell và phạm vi đó sau đó được gọi.

Phạm vi có một phương thức mặc định. Trong Python, điều này dịch sang lớp phạm vi có thể gọi được và gọi nó gọi nó là phương thức mặc định.

Phương thức mặc định cho phạm vi là mục, và vì vậy bit mã này thực sự tương đương với

from pyxll import xl_app
xl = xl_app()

# In Python, the parentheses are necessary to call the method
xl.Range('B11:K11').Select()
7. Phương thức vật phẩm không mong đợi một đối số Rowoffset, và vì vậy, tại sao nó thất bại theo cách này.

Các đối tượng tiềm ẩn và ‘với các & nbsp; ¶

Khi viết mã VBA, mã thường được viết ‘trên một đối tượng như sổ làm việc hoặc một tờ. Đối tượng đó được sử dụng ngầm khi viết mã VBA.

Nếu sử dụng câu lệnh ‘với..end, trong VBA, mục tiêu của câu lệnh‘ với câu lệnh trở thành đối tượng ngầm.

Nếu một thuộc tính không được tìm thấy trên đối tượng ngầm hiện tại (ví dụ: một thuộc tính được chỉ định trong câu lệnh ‘với..end,) thì cái tiếp theo sẽ được thử (ví dụ: bảng tính thì thói quen phụ được liên kết với). Cuối cùng, đối tượng ứng dụng Excel được sử dụng ngầm.

Trong Python không có đối tượng ngầm và đối tượng bạn muốn tham chiếu phải được chỉ định rõ ràng.

Ví dụ: mã VBA sau chọn một phạm vi và thay đổi chiều rộng cột.

from pyxll import xl_macro, xl_app


@xl_macro
def macro1():
    xl = xl_app()

    # 'xl' is an instance of the Excel.Application object

    # Get the current ActiveSheet (same as in VBA)
    sheet = xl.ActiveSheet

    # Call the 'Range' method on the Sheet
    xl_range = sheet.Range('B11:K11')

    # Call the 'Select' method on the Range.
    # Note the parentheses which are not required in VBA but are in Python.
    xl_range.Select()
2

Để viết cùng một mã trong Python, mỗi đối tượng phải được tham chiếu rõ ràng.

from pyxll import xl_macro, xl_app


@xl_macro
def macro1():
    xl = xl_app()

    # 'xl' is an instance of the Excel.Application object

    # Get the current ActiveSheet (same as in VBA)
    sheet = xl.ActiveSheet

    # Call the 'Range' method on the Sheet
    xl_range = sheet.Range('B11:K11')

    # Call the 'Select' method on the Range.
    # Note the parentheses which are not required in VBA but are in Python.
    xl_range.Select()
3

Bộ sưu tập lập chỉ mục & NBSP; ¶

VBA sử dụng dấu ngoặc đơn (

' Select is a method and is called without parentheses in VBA
Range("B11:K11").Select
6) cho các phương thức gọi và để lập chỉ mục vào các bộ sưu tập.

Trong Python, niềng răng vuông (

from pyxll import xl_app
xl = xl_app()

# In Python, the parentheses are necessary to call the method
xl.Range('B11:K11').Select()
9) được sử dụng để lập chỉ mục vào các bộ sưu tập.

Cần cẩn thận khi lập chỉ mục vào các bộ sưu tập Excel, vì Excel sử dụng phần bù chỉ mục là 1 trong khi Python sử dụng 0. Điều này có nghĩa là để có được mục đầu tiên trong bộ sưu tập Python bình thường, bạn sẽ sử dụng Index 0, nhưng khi truy cập các bộ sưu tập từ đối tượng Excel Mô hình bạn sẽ sử dụng 1.

Enums và các giá trị không đổi & nbsp; ¶

Khi viết các giá trị enum VBA có thể truy cập trực tiếp trong phạm vi toàn cầu. Ví dụ: bạn có thể viết

from pyxll import xl_macro, xl_app


@xl_macro
def macro1():
    xl = xl_app()

    # 'xl' is an instance of the Excel.Application object

    # Get the current ActiveSheet (same as in VBA)
    sheet = xl.ActiveSheet

    # Call the 'Range' method on the Sheet
    xl_range = sheet.Range('B11:K11')

    # Call the 'Select' method on the Range.
    # Note the parentheses which are not required in VBA but are in Python.
    xl_range.Select()
4

Trong Python, các giá trị enum này có sẵn dưới dạng hằng số trong gói

from pyxll import xl_app
xl = xl_app()

# Value is a property and so no parentheses are used
value = xl.Range('B11:K11').Value
0. Mã trên sẽ được viết lại trong Python như sau

from pyxll import xl_macro, xl_app


@xl_macro
def macro1():
    xl = xl_app()

    # 'xl' is an instance of the Excel.Application object

    # Get the current ActiveSheet (same as in VBA)
    sheet = xl.ActiveSheet

    # Call the 'Range' method on the Sheet
    xl_range = sheet.Range('B11:K11')

    # Call the 'Select' method on the Range.
    # Note the parentheses which are not required in VBA but are in Python.
    xl_range.Select()
5

Excel và rening & nbsp; ¶

Trong VBA, mọi thứ luôn chạy trên chủ đề chính của Excel. Trong Python, chúng tôi có hỗ trợ đa luồng và đôi khi để thực hiện một nhiệm vụ chạy dài, bạn có thể muốn chạy mã trên một luồng nền.

Mô -đun Python

from pyxll import xl_app
xl = xl_app()

# Value is a property and so no parentheses are used
value = xl.Range('B11:K11').Value
1 tiêu chuẩn là một cách thuận tiện để chạy mã trên một luồng nền trong Python. Tuy nhiên, chúng ta phải cẩn thận về cách chúng ta gọi trở lại Excel từ một luồng nền. Vì VBA không có khả năng sử dụng các luồng, các đối tượng Excel không được viết theo cách mà chúng có thể được sử dụng trên các luồng khác nhau. Cố gắng làm như vậy có thể dẫn đến các vấn đề nghiêm trọng và thậm chí khiến Excel gặp sự cố!

Để có thể làm việc với nhiều luồng và vẫn gọi trở lại Excel Pyxll có chức năng

from win32com.client.gencache import EnsureDispatch

# Get the first open Excel.Application found, or launch a new one
xl = EnsureDispatch('Excel.Application')
7. Điều này được sử dụng để lên lịch chức năng Python để chạy trên chủ đề chính của Excel, theo cách mà các đối tượng Excel có thể được sử dụng một cách an toàn. Bất cứ khi nào bạn đang làm việc với các chủ đề và cần sử dụng API Excel, bạn nên sử dụng
from win32com.client.gencache import EnsureDispatch

# Get the first open Excel.Application found, or launch a new one
xl = EnsureDispatch('Excel.Application')
7.

Ví dụ: bạn có thể sử dụng macro Excel để bắt đầu một nhiệm vụ chạy dài và khi nhiệm vụ đó hoàn thành, hãy viết kết quả trở lại Excel. Thay vì viết kết quả trở lại Excel từ luồng nền, hãy sử dụng

from win32com.client.gencache import EnsureDispatch

# Get the first open Excel.Application found, or launch a new one
xl = EnsureDispatch('Excel.Application')
7 thay thế.

from pyxll import xl_macro, xl_app


@xl_macro
def macro1():
    xl = xl_app()

    # 'xl' is an instance of the Excel.Application object

    # Get the current ActiveSheet (same as in VBA)
    sheet = xl.ActiveSheet

    # Call the 'Range' method on the Sheet
    xl_range = sheet.Range('B11:K11')

    # Call the 'Select' method on the Range.
    # Note the parentheses which are not required in VBA but are in Python.
    xl_range.Select()
6

Ghi chú về gỡ lỗi & nbsp; ¶

Trình chỉnh sửa VBA Excel đã tích hợp gỡ lỗi để bạn có thể bước qua mã và xem những gì xảy ra ở mỗi giai đoạn.

Khi viết mã python, đôi khi dễ dàng viết mã bên ngoài Excel trong python ide của bạn trước khi điều chỉnh nó để được gọi từ excel như một hàm macro hoặc menu, v.v.

Khi gọi mã của bạn từ Excel, hãy nhớ rằng bất kỳ trường hợp ngoại lệ chưa học nào cũng sẽ được in vào tệp nhật ký PYXLL và do đó, đó phải luôn là nơi đầu tiên bạn tìm kiếm những gì đi sai.

Nếu bạn thấy rằng bạn cần có khả năng bước qua mã Python của mình vì nó đang được thực thi trong Excel, bạn sẽ cần một IDE Python hỗ trợ gỡ lỗi từ xa. Gỡ lỗi từ xa là cách các trình gỡ lỗi kết nối với một quy trình bên ngoài mà họ đã không tự bắt đầu.

Bạn có thể tìm thấy các hướng dẫn để gỡ lỗi mã Python chạy trong Excel trong bài đăng trên blog này gỡ lỗi bổ trợ Python Excel của bạn.

[1]Nếu bạn thích sử dụng
from pyxll import xl_app
xl = xl_app()

# Value is a property and so no parentheses are used
value = xl.Range('B11:K11').Value
5 thay vì
from pyxll import xl_macro, xl_app


@xl_macro
def macro1():
    xl = xl_app()

    # 'xl' is an instance of the Excel.Application object

    # Get the current ActiveSheet (same as in VBA)
    sheet = xl.ActiveSheet

    # Call the 'Range' method on the Sheet
    xl_range = sheet.Range('B11:K11')

    # Call the 'Select' method on the Range.
    # Note the parentheses which are not required in VBA but are in Python.
    xl_range.Select()
8, bạn vẫn có thể sử dụng
from pyxll import xl_macro, xl_app


@xl_macro
def macro1():
    xl = xl_app()

    # 'xl' is an instance of the Excel.Application object

    # Get the current ActiveSheet (same as in VBA)
    sheet = xl.ActiveSheet

    # Call the 'Range' method on the Sheet
    xl_range = sheet.Range('B11:K11')

    # Call the 'Select' method on the Range.
    # Note the parentheses which are not required in VBA but are in Python.
    xl_range.Select()
7 bằng cách vượt qua
from pyxll import xl_app
xl = xl_app()

# Value is a property and so no parentheses are used
value = xl.Range('B11:K11').Value
8.

Macro excel có thể được viết bằng Python không?

Bạn có thể viết một macro Excel trong Python để làm bất cứ điều gì bạn đã sử dụng trước đây. Macro làm việc theo cách rất giống với các chức năng bảng tính. Để đăng ký một chức năng làm macro, bạn sử dụng bộ trang trí XL_MACRO. Macro rất hữu ích vì chúng có thể được gọi khi các phần tử GUI (nút, hộp kiểm, v.v.) to do whatever you would previously have used VBA for. Macros work in a very similar way to worksheet functions. To register a function as a macro you use the xl_macro decorator. Macros are useful as they can be called when GUI elements (buttons, checkboxes etc.)

Tôi có thể chuyển đổi VBA thành Python không?

Tất cả mọi thứ bạn có thể viết trong VBA đều có thể được thực hiện bằng Python.Trang này chứa thông tin sẽ giúp bạn dịch mã VBA của bạn thành Python.Xin lưu ý rằng mô hình đối tượng Excel là một phần của Excel và được Microsoft ghi lại.. This page contains information that will help you translate your VBA code into Python. Please note that the Excel Object Model is part of Excel and documented by Microsoft.

VBA hay Python có tốt hơn cho Excel không?

Không giống như ngôn ngữ VBA được sử dụng trong Excel, phân tích dữ liệu sử dụng Python là sạch hơn và cung cấp kiểm soát phiên bản tốt hơn.Tốt hơn là sự nhất quán và độ chính xác của Python trong việc thực thi mã.Người dùng khác có thể sao chép mã gốc và vẫn trải nghiệm thực hiện suôn sẻ ở cùng cấp độ với mã gốc.data analysis using Python is cleaner and provides better version control. Better still is Python's consistency and accuracy in the execution of code. Other users can replicate the original code and still experience a smooth execution at the same level as the original code.

Excel VBA có tương tự như Python không?

Python và VBA có thể xử lý các chức năng tương tự khi tự động hóa, nhưng Python có khả năng xử lý khối lượng dữ liệu lớn hơn nhiều so với VBA.Với Python, các tính toán nhanh hơn và các công thức phức tạp hơn có thể được xử lý so với VBA của Excel.Sức mạnh của Python đến từ các thư viện của nó.