• ベストアンサー

Excel2021 VBAからPython制御

VBAからPythonでブラウザの制御方法についてアドバイスをお願いします。 xlwings_udfsで以下のPython関数を呼んでブラウザを起動させた後に 更に別のPython関数でそのブラウザに対して実行掛けたいのですが ブラウザが閉じてしまいます。 @xw.func def Init(): #ドライバーインポート from selenium import webdriver from selenium.webdriver.common.by import By #ブラウザー起動 driver = webdriver.Chrome() return 0 ブラウザを閉じずに別のPython関数に継承する方法は、ないのでしょうか? 以下の様な感じです。何らかの方法でdriver変数を継承する必要があるかと思うのですがそれも上手く行きません。 msg2 = xlwings_udfs.Init() msg2 = xlwings_udfs.Proc1() msg2 = xlwings_udfs.Proc2() 色々と調べたのですが見つかりませんでした。 御存じの方が居られましたらアドバイスの程、 宜しくお願い申し上げます。

  • Python
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • luka3
  • ベストアンサー率74% (299/401)
回答No.1

・PythonのSeleniumを使って、起動済みのブラウザを操作する https://qiita.com/mimuro_syunya/items/2464cd2404b67ea5da56 VBA側であらかじめchromeを開いておいて、Pythonからはポート指定で起動済みのブラウザにアタッチして操作する、という方法でいけると思います。

rucifar_k
質問者

お礼

有り難う御座います。 こんなやり方があったのですね。 やってみます。

関連するQ&A

  • pythonでエクセルにコピペできない

    pythonでWebページにログインし、レポートを全選択して エクセルにペーストしたいのですが、エクセルにペーストできないです。 どのように修正したら良いのでしょうか? よろしくお願いします。 【確認したこと】 1.エクセルは更新履歴が変わっているので、開いて保存はしている。 2.プログラム終了後、手動でエクセルを開いてctrl+vするとコピーした値をペーストできる。(クリップボードにはコピーされている) 3.新規エクセルで試してもペーストできない。 import time import chromedriver_binary import pyautogui import openpyxl from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome import service wb = openpyxl.load_workbook("./BOS_Data.xlsx") #WEBブラウザの起動 driver = webdriver.Chrome() #自動ログインしたいウェブサイトのURLをコピペ driver.get('https://xxx/Login/default.asp') USER = 'o2' PASS = 'M3' my_id = driver.find_element(By.NAME, 'sUserName') password = driver.find_element(By.NAME, 'sPassword') submit_btn = driver.find_element(By.NAME, 'submit') #自動入力したIDとパスワードを入力 my_id.send_keys(USER) password.send_keys(PASS) #ログインボタンを自動入力 submit_btn.click() #Reportをクリック driver.find_element(By.XPATH, '/xxxxxxxx).click() #全選択して、コピー pyautogui.hotkey('ctrl', 'a') pyautogui.hotkey('ctrl', 'c') #すでに存在するExcelワークブックを読み込み、ペーストして保存 wb = openpyxl.load_workbook("./BOS_Data.xlsx") ws = wb['Sheet1'] wc = ws['A1'] pyautogui.hotkey('ctrl', 'v') time.sleep(3) wb.save("./BOS_Data.xlsx")

  • python スクレイピングに関して

    windows vagrant virtualbox ubuntu python3 という環境でubuntu側でdriver = webdriver.Remot('http://10.0.2.2:4444', options=options)を動かして、ホスト側のコマンドプロンプトでchromedriver --port=4444を起動していますが、selenium.common.exceptions.WebDriverException: Message: Host header or origin header is specified and is not whitelisted or localhost.というエラーが発生し、chromeが起動しません。 解決方法を教えていただけないでしょうか。

  • pythonのfor文のエラーについて

    現在pythonでwebスクレイピングの勉強をしている者です。 質問があるのですが、 from selenium import webdriver browser=webdriver.Chrome() browser.get("https://movie.jorudan.co.jp/cinema/") #クラスからリンクを抜き出してクリックさせる。 siwake=[] elems=browser.find_elements_by_class_name("item-body") for i in elems: elem=i.find_element_by_tag_name("a") elem.click() #クラスのジャンルからaタグのテキストを抜き出して前のページに戻る。   elem=browser.find_element_by_class_name("genre") elem=elem.find_element_by_tag_name("a").text browser.back()   #抜き出した情報をsiwakeの空のリストに追加する。 siwake.append(elem) 上記のコードで映画のジャンルの一つ目を抜き取りたいのですが、for文を回すとエラーが出てしまいます。 どなたか原因が解る方がいらっしゃいましたらご教示して頂けると幸いです。 参考HPはhttps://movie.jorudan.co.jp/cinema/です。 よろしくお願い致します。

  • Firefox Portableをrubyで操作し

    次の環境でrubyにseleniumをインストールしてFirefoxの自動操作を行っています。  OS: Windows10  ブラウザ: Firefox 42  ruby : 2.1.7 Firefoxの代わりに、Firefox Portable (バージョンはできれば42。それ以外でも可)を操作したいのですが、どのようにrubyに記述すればよいでしょうか。 Firefoxのアドオンを利用したいので、毎回同じプロファイルを使用するため、いまのところ次のように記載しています。 ============================================== require 'selenium-webdriver' default_profile = Selenium::WebDriver::Firefox::Profile.from_name "default" default_profile.native_events = true driver = Selenium::WebDriver.for(:firefox, :profile => default_profile) driver.get "http://www.yahoo.co.jp/" ============================================== これに何か情報を書き加えれば、Firefox Portableを起動できると考えているのですが、ちょっとわからないので、教えてください。

    • ベストアンサー
    • Ruby
  • Ruby Selenium 要素の待機

    Rubyの初心者でSeleniumを使ってスクレイピングを趣味としてしているものです。 ブラウザはchromeです。 スクレイピングをしたいページで404が数回続き、やっと読み込めるサイトがあるので、404エラーで止まってしまうのである要素が無ければもう一度やり直す、そのようになったら初めからやり直してみる形にしたいと思って色々と調べ試行錯誤をしています。 https://www.qoosky.net/references/58/ を参考に require 'selenium-webdriver' driver = Selenium::WebDriver.for :chrome #chrome のdriverを設定 driver.navigate.to "http://google.com" wait = Selenium::WebDriver::Wait.new(:timeout => 10) # seconds begin element = wait.until { driver.find_element(:id => "hoge") } ensure driver.quit driver.navigate.to "http://google.com" end id、hogeが無ければもう一度読み直すような形でやってみたのですが全く意味をなしていないようです。 何卒どうかご教授、よろしくお願いします。

    • ベストアンサー
    • Ruby
  • Pythonでのimport

    Pythonで、 from enthought.traits.api import HasTraits をしようとすると、 No module named enthought.traits.api とエラーがでるのですが、どうしたらいいのでしょうか。 詳細: 知人の.pyファイルをもらって起動させようとすると、どうやら上の行で躓いてしまいます。 Pythonは2.6でwindows 7を使用しています。 説明が少なくてすみません。

  • pythonのfor文のエラーについて

    現在pythonでwebスクレイピングの勉強をしている者です。 質問があるのですが、 from selenium import webdriver browser=webdriver.Chrome() browser.get("https://movie.jorudan.co.jp/cinema/") #クラスからリンクを抜き出してクリックさせる。 siwake=[] elems=browser.find_elements_by_class_name("item-body") for i in elems:  elem=i.find_element_by_tag_name("a")  elem.click() #クラスのジャンルからaタグのテキストを抜き出して前のページに戻る。  elem=browser.find_element_by_class_name("genre")  elem=elem.find_element_by_tag_name("a").text  browser.back()   #抜き出した情報をsiwakeの空のリストに追加する。  siwake.append(elem) 上記のコードで映画のジャンルの一つ目を抜き取りたいのですが、for文を回すとエラーが出てしまいます。 エラーとしては、 elems=browser.find_elements_by_class_name("item-body") for i in elems: ……→elem=i.find_element_by_tag_name("a") 上の一文がエラーとして出てきます。 また、一番下にはMessage:stale element reference: element is not attached to the page document という表記が出てきます。   どなたか原因が解る方がいらっしゃいましたらご教示して頂けると幸いです。 参考HPはhttps://movie.jorudan.co.jp/cinema/です。 よろしくお願い致します。

  • RubyでCSVファイルの1行目を削除したい 

    Rubyの初心者でSeleniumを使ってスクレイピングを趣味としてしているものです。 ブラウザはchromeです。 この間、例外が上がったときに一定回数リトライする方法をご伝授頂きました。 http://okwave.jp/qa/q8722965.html そしてそれを活用して、CSVにスクレイピングをしたいURLを1列目に並べ、複数のページをスクレイピングしているのですが、 def try(n=10) require 'pp' require 'csv' require 'selenium-webdriver' require 'open-uri' hoge_path = File.expand_path('../hoge.csv',__FILE__) driver = Selenium::WebDriver.for :chrome #chrome のdriverを設定 CSV.foreach(hoge_path) do |row| driver.navigate.to row[1] #URL移動 #ページの移動など driver.quit #ブラウザ終了 driver = Selenium::WebDriver.for :chrome #chrome のdriverを設定 end rescue => e if n==0 raise e driver.quit #ブラウザ終了 else driver.quit #ブラウザ終了 try(n-1) end end try よく仕組みを理解できていないのですが、CSV.foreach内はループされます。 そして、404エラーなどで落ちるとまた一行目に戻ってスクレイピングが行われ、非常に困っています。 そこで、CSVファイルの1行目をループするまたは例外のリトライの際に削除していけば良いと考えたのですが、一行目を削除するというコードをどう書けばいいのか分かりません。 どうかご伝授お願いします。

    • ベストアンサー
    • Ruby
  • Pythonのバージョンアップについて

    CentOS5.5にはPython2.4がデフォルトで入っているのですが、Python2.6でスクリプトを作成する必要がありバージョンアップをしているのですが、dbusモジュールのインポートができず行き詰っております。 具体的には、Python2.4とdbus-pythonがインストールされている状態で、下記のURLを参考にyumでPython2.6をインストールしました。 環境としては「/usr/bin/phthon2.4」と「/usr/bin/phthon2.6」が出来た状態です。 libは「「/usr/lib/phthon2.4」と「/usr/lib/phthon2.6」です。 dbus-pythonのインストール先は「/usr/lib64/python2.4/site-packages/dbus」になります。 Python2.4を環境で下記のインポートは問題ありません。 >>>import dbus しかし、Python2.6環境で同じコマンドを実行すると下記のようなエラーになります。 >>> import dbus Traceback (most recent call last): File "<stdin>", line 1, in <module> ImportError: No module named dbus dbusの再インストールはリスクが高いと思い、モジュールのパスを通してみたところ下記のようなエラーになりました。 >>> import sys >>> sys.path.append('/usr/lib64/python2.4/site-packages') >>> import dbus Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib64/python2.4/site-packages/dbus/__init__.py", line 1, in <module> from _dbus import * File "/usr/lib64/python2.4/site-packages/dbus/_dbus.py", line 45, in <module> import dbus_bindings ImportError: /usr/lib64/python2.4/site-packages/dbus/dbus_bindings.so: undefined symbol: Py_InitModule4 rpmでモジュールインストール先の変更や、Python自体をソースからインストールなどしてみたのですが、全てうまく行かない状態です。 Pythonバージョンアップ前にインストールされているモジュールの使い方をご存知の方がおられましたら、宜しくお願いします。

  • LIFeBOOK UH

    seleniumをインストールすることができません。 yahooやgoogleに載っているどの方法をやってみても driver=webdriver.Chrome() のときにエラーが出ます。 対処方法を教えてください。 ※OKWAVEより補足:「富士通FMV」についての質問です。

専門家に質問してみよう