Django Girls and Boys 備忘録

Python、Django、java、iPhoneアプリ,Excelマクロなどで気付いたこと、覚えておきたいことなどを載せていきます。

【Excel 名前の定義】「名前"○○○"は既に存在します。この名前にする・・・」のメッセージ表示を解決する方法


ExcelVBAを使ってシートのコピーのようなことをしていたら突然以下のようなメッセージが出だして対応に困ったことがありました。

 

「名前"○○○"は既に存在します。この名前にする場合には、[はい]をクリックします。移動またはコピーを行うために"○○○"の名前を変更する場合には[いいえ]をクリックします。」

 

今回は、その対応方法の説明になります。

 

内容的には、古いExcelを使用している場合に、発生するようなのですが、そのExcel「名前の定義」がされている時にシートのコピーを行うと発生するということです。

 

自分自身、「名前の定義」などというものを意識的に設定した覚えはなかったのですが、そのファイルが何かを流用したようなファイルだったか、それとも自動的に名前が付けられるような場合もあるのかですが、いつの間にかかなりの数の名前が設定されていました。

 

結果的には、この「名前の定義」の名前自体が不要であれば削除してあげればいいというようなものです。

 

具体的には、

1.まずは、

メッセージが出なくなるまで「はい」をクリックする

 

2.以下のように、

「数式」タブの「名前の管理」をクリックすると、名前の管理用ウインドウが表示されますのでそこにある不要な名前(#REF!などと表示のあるもの)を削除する

 

とすることで、メッセージが出なくなります。

 

削除に際しては、プリントエリアを指定する「Print_Area」とタイトル行と列を指定する「Print_Titles」は削除せずに残します。

 

名前の定義削除方法1

名前の定義削除方法1

 

ただし、まれにそれを行ってもまだ表示される場合があります。

 

これは、VBAなどで、

 

「名前の定義」を非表示にされている場合がある

 

ということのようなのですが、その場合には、「名前の定義」を表示させてやらなければなりません。

 

VBAを使用して非表示の「名前の定義」を表示させる方法は以下のようになります。

 

Sub VisibleName()
    Dim n   As Name
    
    For Each n In ActiveWorkbook.Names
        n.Visible = True
    Next
End Sub

 

これをVBA側の標準モジュールなどに記載して実行してやれば「名前の定義」に名前が表示されるようになります。

表示されたら同様に不要な定義を削除すればメッセージが表示されなくなります。

 

参考にさせてもらったURLは以下になります。

 

参考URL:

https://vbabeginner.net/error-includes-existing-name/

 

 

 

 

 

 

 

 

【Python Excel】ExcelからのPython実行ファイル(アプリケーションファイル)起動方法


ExcelPythonプログラムの連携を行う場合、ExcelからPythonのEXEファイルを起動するような処理が必要になってくる場合があります。

 

そのような場合にはWshShellを使用します。

 

目次

 

1.Excel VBEの「参照設定」にてライブラリ追加

 

WshShellを使用する場合には、ExcelのVBE(Visual Basic Editor)側でライブラリを追加しなければなりません。

 

以下のように、VBEの「ツール」タブにて、「参照設定」を選択します。

 

Excel VBE 「参照設定」選択

Excel VBE 「参照設定」選択

 

続いて、「参照設定」選択にて開いた以下の選択ウインドウにて「Windows Script Host Object Model」にチェックを入れて「OK」をクリックします。

 

Excel VBE 「参照設定」 にて「Windows Script Host Object Model」選択

Excel VBE 「参照設定」 にて「Windows Script Host Object Model」選択

 

これで、「WshShell」オブジェクトが使用可能になりました。

 

2.アプリケーション起動コード指定

 

WshShellを使用する場合には、ExcelVBA側で以下のようなコード指定にてアプリケーションファイルを起動することができます。

 

    Set ws = CreateObject("Wscript.Shell")
    ws.CurrentDirectory = ThisWorkbook.Path
    ws.Run """abc.exe""", 1, True         'コンソールが開く        
    Set ws = Nothing

 

上記は、Excelファイルと同じフォルダに、PythonのEXEファイル(上記ではabc.exe)をを置いておいてそのファイルを起動する場合の例になります。

 

まずはじめに、1行目でCreateObjectにて「WindowsScriptHost」オブジェクトを生成しています。

次に、2行目では、そのカレントディレクトリにExcelファイル自身のパスを設定しています。

 

3行目で、Runメソッドを使用して「abc.exe」を起動しています。

 

 

3.Runメソッドの引数の説明

 

Runメソッドでは3つの引数指定ができます。

 

第1引数:起動するファイルを指定

上記ではカレントディレクトリにexeファイルを入れておいてそれを指定するだけですが、パス指定するような場合に、その中にスペースが含まれているような場合にはさらに""で囲まなければならないということになります。

""の中に""を入れる場合には、""2つで囲むということなので結果として左右に3つずつのダブルコーテーションになるということです。

逆に、上記の例のような場合にはファイル指定内にスペースがないため、単に「"abc.exe"」だけでも動作します。

 

第2引数:実行するアプリケーションのウインドウスタイル指定

 

第2引数の数値 ウインドウスタイル アクティブウインドウ
0 非表示 変わらない
1 通常サイズ 起動アプリケーション
2 最小化 同上
3 最大化 同上
4 通常サイズ 変わらない
5 そのまま 起動アプリケーション
7 最小化 変わらない

(引数省略時:1指定)

 

参照URL:https://atmarkit.itmedia.co.jp/ait/articles/0709/12/news125.html

 

指定により上記のようにウインドウスタイルとアクティブウインドウが変更されるということです。

引数を省略したり、1指定した場合には起動にあわせてコンソールウインドウが表示されますが、表示したくないような場合には、0指定とすれば表示されなくなります。

 

第3引数:起動アプリケーションの終了を待つか待たないか

(TrueまたはFalse指定)

省略した場合にはFalse指定のため、終了を待たずに次の行に進みます。Trueにした場合には、アプリケーションの終了待ちになります。

【Python Selenium】EdgeのI.E.モードでブラウザ操作する場合のドライバー設定方法と簡単な起動例


PythonSeleniumを使用してWebサイトへアクセスする場合ですが、ブラウザとしてEdgeを使用する場合の例は以前以下のような過去記事で記載しました。

 

 

kuku81kuku81.hatenablog.com

 

 

先日、I.E.のサポートが終了しましたが、システムによってはI.E.でアクセスしなければというシステムもまだ残っていると思います。

 

今回はEdgeのI.E.モードでドライバーを設定してWebサイトへアクセスする場合について簡単な例を挙げて説明します。

 

EdgeのI.E.モードでブラウザ操作する場合には、あらかじめいくつかの事前設定が必要になってきます。

事前設定については、以下の前回の過去記事にて記載していますので設定しておいてください。

 

 

kuku81kuku81.hatenablog.com

 

 

続きを読む

【Python Selenium】EdgeのI.E.モード操作の事前準備での設定


PythonSeleniumを使用してWebサイトへアクセスする場合ですが、ブラウザとしてEdgeを使用する場合の例は以前以下のような過去記事で記載しました。

 

 

kuku81kuku81.hatenablog.com

 

 

先日、I.E.のサポートが終了しましたが、システムによってはI.E.でアクセスしなければというシステムもまだ残っていると思います。

 

今回はEdgeのI.E.モードでドライバーを設定してWebサイトへアクセスする場合に必要なブラウザ側の設定について説明します。

続きを読む

【Excel マクロ(VBA) 行削除】条件を満たした行を削除する方法(For~Next文を使用)

 


ExcelVBAにて、表などを1行ずつ見ていって、ある条件を満たした行だけ行削除したいような場合があると思います。

そのような場合の方法についての説明になります。

 

通常、For~Next文で処理をする場合、1行目からはじめて処理をしたい最後の行までというように記述する場合が多いと思います。

 

自分もはじめはそのように思い、行削除の場合でもそのやり方でなんとかよろうとしていました。

ただし、行削除の場合には、そうしてしまうと削除するたびに現在処理している行や最終行の行番号がずれてしまって非常に大変な処理になってしまうと思います。

 

そのようになってしまう場合には、逆に、最終行から先頭行に向かってFor~Next文を組んで処理をしてあげればいいということがわかりました。

 

たとえば、以下のような処理になります。

 

    '1行目から20行目まで1列目が空白の場合は行削除する。
    For i = 20 To 1 Step -1
        If Cells(i, 1) = "" Then
            Rows(i).Delete
        End If
    Next i

 

この例の場合には。20行目から1行目まで1行ずつさかのぼって1列目が空白の場合には行削除するというような内容になります。

 

このようにすれば、処理の方向が上への方向なので行削除をしてもこれから処理をしていく上方向の行番号には影響がなく、最終行も先頭の1行目なので行削除の影響は受けないので処理のわずらわしさはなくなります。

 

はじめて知ったときは目からうろこでした。

 

ちなみに

 

Rows(1).Delete

 

のように、削除にDeleteを使用した場合は行が削除されて上に移動しますが、

 

Rows(1).Clear

 

のようにClearを使用すると、行の中身の値や書式だけが削除されて空白の行となるだけでそれ以降の行が上に移動することはありません。

 

 

 

 

 

【Excel マクロ(VBA)】最大行番号、最大列番号を取得する方法


Excelのマクロを使用している場合に頻繁にやらなければならないことの一つに

データが入力されている最大行番号や最大列番号を取得する

ということがあると思います。

 

この場合、上から順番にチェックしていき、データがなくなった時が最大行番号とすると、途中で空欄がある場合などにうまく最大行が取得できないことがあります。

 

そのような場合には、逆にExcelの最大行、最大列側からさかのぼってチェックして、はじめてデータがあらわれたところを最大とするやり方があります。

 

これに関しては、1行程度の記載で簡単に求められます。

 

たとえば、以下のようなコードになります。

 

RowMax = Cells(Rows.Count, 1).End(xlUp).Row

 

この例の場合には、

 

「1列目に関して、最大行からさかのぼってはじめにデータがあらわれた行番号をRowMaxに代入する」

 

という内容になります。

 

同様に、最大列番号を求めるコードには、以下のような例があります。

 

ColMax = Cells(2, Columns.Count).End(xlToLeft).Column

 

この場合は、

 

「2行目に関して、最大列からさかのぼってはじめにデータがあらわれた列番号をColMaxに代入する」

 

という内容になります。

 

たとえば、以下のような表があった場合には、

 

テスト結果

テスト結果

 

以下のようなコードをVBAで記載することで、

3行目からデータの最大行まで、途中で空欄行があった場合も処理記載の内容の処理を継続してさせることができます(途中、空欄行の処理は何かしら必要になると思いますが)。

 

Sub Test()
 
'最大行数
RowMax = Cells(Rows.Count, 2).End(xlUp).Row
'最大列数
ColMax = Cells(2, Columns.Count).End(xlToLeft).Column

For i = 3 To RowMax
    '処理記載
Next i

End Sub

 

また、上記の表のように空欄行や空欄列がなかった場合になりますが、以下のようなコードを記載することで、生徒数、科目数を求めることができます。

 

このフォーマットのまま、生徒が下方向、科目が右方向に追加されたり、削除されたりていってもこのコードのままで対応できると思います。

 

Sub Test()
 
'最大行数
RowMax = Cells(Rows.Count, 2).End(xlUp).Row
'最大列数
ColMax = Cells(2, Columns.Count).End(xlToLeft).Column
'生徒数、科目数
生徒数 = RowMax - 2
科目数 = ColMax - 2

End Sub

 

 

 

 

 

 

【Python】キー入力によるプログラム終了処理、ループを抜けて次の処理へ移行する処理

 

Pythonにてプログラム作成中に、何かのキーが押されたら処理を終了したいとか、ループを抜けたいという場面はいろいろと出てくると思います。

 

今回は、あるキー入力でプログラム終了または処理を抜ける場合のコードを例を挙げて説明します。

 

自分自身が最近行っていた作業の中でも、プログラム実行中にユーザーが途中で作業をやめたい、画面を閉じて終了したいという場面がありました。

 

そのような時に、どのようにしたらいいかを考えて実施した結果が以下のようなものでした。

 

#   Escapeキーを2秒以上押し続けたらプログラム終了
    while  True:
        if keyboard.is_pressed('escape'):
            messagebox.showinfo('メッセージ','処理を終了しました。')
            sys.exit()
        time.sleep(2)

 

このコードをプログラムの終了処理のあたりに追加しておくことで、

while文でループを回しておいて、「Escape」キーを2秒以上押し続けたら終了

のような処理とすることができました。

 

ちなみに、

「Enter」キーを押したら次の処理へ移行

のような処理としたい場合には例えば以下のようになります。

 

#   Enterキーを推したらループを抜けて次の処理へ
while  True:
    if keyboard.is_pressed("enter"):
        print('メッセージ','処理を抜けました。')
        break

 

また、seleniumでの処理になりますが、以下のようにしておくことで、実行すると、

Google検索画面を表示したまま待機状態となり、「Escape」キーを2秒以上押し続けると処理終了

となります。

(以下はEdge用の処理コードです)

 

from selenium import webdriver
import os
import time
import sys
from selenium.webdriver.chrome import service as fs
from tkinter import messagebox
import keyboard


######################################################################
path_driver = os.getcwd()+'\msedgedriver.exe'
# ドライバー指定でEdgeブラウザを開く
edge_service = fs.Service(executable_path=path_driver)
#edge_service.creationflags = CREATE_NO_WINDOW
driver = webdriver.Edge(service=edge_service)
######################################################################

driver.get('https://www.google.com/')


#   Escapeキーを2秒以上押し続けたらプログラム終了
while  True:
    if keyboard.is_pressed('escape'):
        messagebox.showinfo('メッセージ','処理を終了しました。')
        sys.exit()
    time.sleep(2)

 

以上が、キー入力によるプログラムの終了処理、ループを抜けて次の処理へ移行の場合のコードの例となります。