pywin32 выбирает все данные в столбце Excel - PullRequest
0 голосов
/ 04 января 2019

Я очень плохо знаком с python, но раньше использовал Excel VBA.Я пытаюсь использовать модуль pywin32, так как он использует COM для открытия и чтения / записи Excel, а также по многим другим причинам.

У меня нет проблем при написании формул в pywin32 для записи в Excel, т. Е. SUM, деление, минус и т. д. Но у меня возникают проблемы при написании таких функций, как xlUp, CountIF и т. д. в python.

В приведенном ниже коде я пытаюсь написать код, который проверяет дубликаты во всех ячейках столбца (т.е.колонка "C")

Не могли бы вы помочь по приведенному ниже коду?

from win32com.client import Dispatch
from pathlib import Path
from datetime import datetime
import win32com.client.dynamic
data_folder = Path("C:/..")
file_open = data_folder / "something.xlsx"

xl = Dispatch("Excel.Application")

wb1 = xl.Workbooks.Open(Filename=file_open)
ws1 = wb1.Worksheets(1)

Target = ws1.Range("C3", ws1.Range("C", ws1.Rows.Count).End(xlUp)).Select

for r In Target:
   r.Offset(0, 1) = WorksheetFunction.CountIf(Target, r.Value) > 1

excel.Application.quit()

Не знаю, почему он не работает .. Как я могу перевести VBA в Python?

Спасибо

1 Ответ

0 голосов
/ 27 июня 2019

Чтобы обобщить ответ на последний вопрос:

код pywin32 часто очень близок к переводу кода VBA один на один.Но есть ряд небольших изменений, необходимых.Например:

  • Многие константы не определяются pywin32.Константа xlUp определена.Но это достигается как win32.constants.xlUp.Таким образом, это объясняет одну проблему, которую вы имеете
  • Другие константы не определены.Там вам нужно найти значение в документации Microsoft API.Например, «LookAt = xlWhole» становится LookAt = 1
  • . Перевод VBA в python отличается использованием скобок при вызове функций.Это означает, что некоторые атрибуты в VBA требуют, чтобы "()" в конце стало допустимым кодом.Выберите один из примеров.Его нужно использовать как «.Select ()» вместо «.Select» для работы.Это объясняет еще одну проблему, с которой вы столкнулись.
  • Основным исключением из одного в один перевод является "Смещение".По какой-то странной причине Offset (x, y) не работает.Везде, где вы в VBA используете «Смещение (x, y), вы должны использовать« GetOffset (x, y).Это объясняет третью причину, по которой ваш код не работает.
  • Наконец, переменные в python должны начинаться с нижнего регистра.Это безопасно делать и избегать имен переменных, которые могут иметь значение.«Target» безопаснее выражается как «mytarget» или что-то маловероятное, чтобы столкнуться со встроенными функциями.

Я не тестировал код, но указанные выше пункты не позволяют запустить ваш код.С учетом упомянутых изменений я считаю, что это будет работать.Большая часть кода VBA работает как положено в pywin32, просто придерживаясь вышеупомянутых правил.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...