プログラミング勉強の備忘録

主にpythonやスマホアプリを作るためのプログラミングで勉強した内容を忘れないように記載していきます。

【VBA】 よく使う処理のメモ

VBAを使用するときによく使う処理のメモ。

処理一覧

最終行取得

Function get_last_row(sheet As Worksheet, column As Long) As Long
    get_last_row = sheet.Cells(Rows.Count, column).End(xlUp).Row
End Function

引数に最終行を取得したいシートと列を指定すれば、その最終行を取得できる。

フォルダ作成

Sub make_directory(ByVal path As String)
    If Dir(path, vbDirectory) = "" Then
        MkDir path
    End If
End Sub

引数にフォルダパスを指定すれば、フォルダを作成できる。
フォルダが存在すれば、処理は行なわれない。

ファイルコピー

Sub file_copy(ByVal base_file As String, ByVal copy_to As String)
    If Dir(copy_to) = "" Then
        FileCopy base_file, copy_to
    End If
End Sub

引数に元となるファイル名とコピー先のファイル名を指定するとファイルのコピーができる。
コピー先が存在する場合は処理されない。

【参考サイト】

excel-ubara.com
www.moug.net
www.moug.net

【Python】openpyxl を使ってエクセルのセルに罫線を引く

この記事では、ライブラリの「openpyxl」を使って、エクセルのセルに罫線を引く方法を記載します。

  • Python 3.7.4
  • PyCharm 2019.2
  • openpyxl 2.6.2

【基本構成】

今回使用する「pyautogui」は標準ライブラリではないため、インストールが必要です。

サンプルコード

罫線を引く基本構成は下記となります。

import openpyxl as xl
from openpyxl.styles.borders import Border, Side

wb = xl.Workbook()
ws = wb.active

side = Side(style='thin', color='000000')
border = Border(left=side, right=side, top=side, bottom=side)

ws.cell(2, 2).border = border

wb.save('./test.xlsx')

説明

<必要ライブラリのインポート>
from openpyxl.styles.borders import Border, Side

罫線を引く際には「openpyxl」の「styles.borders」にある「Border」と「 Side」を使用するためインポートしています。
「Border」は罫線を引く箇所を指定する際に、「Side」は罫線の種類を指定するために使用します。

<罫線の指定>
side = Side(style='thin', color='000000')

「Side」を使用して罫線の種類を指定しています。
また、引数「color」で罫線の色の指定もできます。
「Side」の詳細はこちらに記載します。

<罫線を引く箇所の指定>
border = Border(left=side, right=side, top=side, bottom=side)

「Border」でセルに対して罫線の引く位置と種類を指定したオブジェクトを作成しています。
下記の引数に「Side」オブジェクトを指定します。

コード 説明
top 上罫線
bottom 下罫線
left 左罫線
right 右罫線
<罫線を引く>
ws.cell(2, 2).border = border

セルに罫線を引いています。
セルの「.border」に対して、「Border」オブジェクトを代入することで罫線を引きます。

Side について 

罫線の種類について

「Side」の「style」の引数に指定する値とその線の種類をまとめておきます。

引数 線のサンプル
mediumDashDotDot f:id:chappy88:20200921165305p:plain
medium f:id:chappy88:20200921165358p:plain
mediumDashed f:id:chappy88:20200921170510p:plain
dotted f:id:chappy88:20200921165550p:plain
thick f:id:chappy88:20200921170325p:plain
dashDotDot f:id:chappy88:20200921165745p:plain
mediumDashDot f:id:chappy88:20200921165814p:plain
hair f:id:chappy88:20200921165855p:plain
dashDot f:id:chappy88:20200921165935p:plain
slantDashDot f:id:chappy88:20200921170102p:plain
double f:id:chappy88:20200921170140p:plain
dashed f:id:chappy88:20200921170218p:plain
thin f:id:chappy88:20200921170247p:plain
線の色について

「Side」の引数「color」についてですが、RGBの組み合わせで色を指定します。

R G B
xx yy zz

【参考サイト】

今回の作業にあたり、下記サイトを参考にさせて頂きました。
openpyxl.styles.borders module — openpyxl 3.0.5 documentation

【Python】pyautoguiを使ったキーボード操作、マウス操作

この記事では、ライブラリの「pyautogui」を使って、キーボード操作、マウス操作する方法について記載します。

  • Python 3.7.4
  • PyCharm 2019.2
  • PyAutoGUI 0.9.47

【一覧】

この記事に記載する処理について、一覧にまとめておきます。
今回使用する「pyautogui」は標準ライブラリではないため、インストールが必要です。

キーボード操作

コード 説明
press() キーを押す
keyDown() キーを押したままにする
keyUp() キーを離す
hotkey() 同時押し
typewrite() キーをタイプしていく

マウス操作

コード 説明
position() マウスの現在位置を取得
moveTo() マウスを指定の座標に向けて移動
moveRel() マウスを現在位置から指定の距離移動
click() 座標指定の位置をクリック
doubleClick() 座標指定の位置ををダブルクリック
dragTo() ドラックして指定の座標に向けて移動
dragRel() ドラックして指定の距離移動

【使い方】

キーボード操作

キーボード操作では、プログラムを実行することで、キーが押される(離す)操作が
行なわれます。
指定可能なキー一覧は下部に記載しておきます。

press()

「press」はキーを押す操作がされます。
使い方は下記の様に、引数に指定可能なキーを1つ渡します。

import pyautogui

pyautogui.press('a')
keyDown()
keyUp()

「keyDown」はキーを押したままにする操作、「keyUp」はキーを離す操作がされます。
使い方は下記の様に、引数に指定可能なキーを1つ渡します。
下記の例では、「Ctrl」を押したまま「C」のキーを押すことで、コピーのショットカット操作を行ない、その後で「Ctrl」を離しています。

import pyautogui

pyautogui.keyDown('ctrl')
pyautogui.press('c')

pyautogui.keyUp('ctrl')
hotkey()

「hotkey」はキーの同時押し操作です。
使い方は下記の様に、引数に複数の指定可能なキーを渡します。
下記の例では、「Ctrl」+「C」のコピーのショートカット操作を行なっています。

import pyautogui

pyautogui.hotkey('ctrl', 'c')
typewrite()

「typewrite」は連続してキーを押す操作です。
使い方は下記の様に、引数に文字列もしくは文字のリストを渡すとその順番に
キーを押す操作がされます。
引数は他にも「interval」、「logScreenshot」があります。(省略可能)
「interval」はキーを押す間の時間を設定できます。
「logScreenshot」はTrueにすることで、操作完了後のスクリーンショットが保存されます。

import pyautogui

pyautogui.typewrite('abcdefg', interval=1.0, logScreenshot=True)
指定可能なキー一覧

下記操作でも確認可能です。

import pyautogui

print(pyautogui.KEYBOARD_KEYS)
['\t', '\n', '\r', ' ', '!', '"', '#', '$', '%', '&', "'", '(',
')', '*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', ':', ';', '<', '=', '>', '?', '@', '[', '\\', ']', '^', '_', '`',
'a', 'b', 'c', 'd', 'e','f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~',
'accept', 'add', 'alt', 'altleft', 'altright', 'apps', 'backspace',
'browserback', 'browserfavorites', 'browserforward', 'browserhome',
'browserrefresh', 'browsersearch', 'browserstop', 'capslock', 'clear',
'convert', 'ctrl', 'ctrlleft', 'ctrlright', 'decimal', 'del', 'delete',
'divide', 'down', 'end', 'enter', 'esc', 'escape', 'execute', 'f1', 'f10',
'f11', 'f12', 'f13', 'f14', 'f15', 'f16', 'f17', 'f18', 'f19', 'f2', 'f20',
'f21', 'f22', 'f23', 'f24', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9',
'final', 'fn', 'hanguel', 'hangul', 'hanja', 'help', 'home', 'insert', 'junja',
'kana', 'kanji', 'launchapp1', 'launchapp2', 'launchmail',
'launchmediaselect', 'left', 'modechange', 'multiply', 'nexttrack',
'nonconvert', 'num0', 'num1', 'num2', 'num3', 'num4', 'num5', 'num6',
'num7', 'num8', 'num9', 'numlock', 'pagedown', 'pageup', 'pause', 'pgdn',
'pgup', 'playpause', 'prevtrack', 'print', 'printscreen', 'prntscrn',
'prtsc', 'prtscr', 'return', 'right', 'scrolllock', 'select', 'separator',
'shift', 'shiftleft', 'shiftright', 'sleep', 'space', 'stop', 'subtract', 'tab',
'up', 'volumedown', 'volumemute', 'volumeup', 'win', 'winleft', 'winright', 'yen',
'command', 'option', 'optionleft', 'optionright']

マウス操作

position()

「position」はマウスの現在位置を取得します。
使用方法は下記の様に、引数なしでコールすると、現在のマウス位置の座標を取得できます。

import pyautogui

mousePoint = pyautogui.position()
print(mousePoint)
# mousePoint >> Point(x=642, y=458)
moveTo()

「moveTo」は指定の座標に向けてマウスを移動させます。
使用方法は下記の様に、移動先の座標を指定すると、その座標に移動します。
省略可能ですが「duration」を指定すると、その時間をかけて対象の座標に移動します。

import pyautogui

pyautogui.moveTo(x=100, y=200, duration=10)
moveRel()

「moveRel」はマウスを現在位置から指定の距離移動させます。
使用方法は、「moveTo」とほぼ同じですが、マウスの移動は今いる位置から指定した距離の移動になります。

import pyautogui

pyautogui.moveRel(100, 200, duration=10)
click()

「click」は指定の座標位置をクリックする操作です。
使用方法は下記の様に、クリックしたい座標を引数にすると、その座標をクリックします。
また、省略可能ですが、「clicks」、「interval」、「button」も引数にあります。
「clicks」はクリック回数を指定できます。(省略時は1回)
「interval」はクリックとクリックの間の時間を指定できます。
「botton」は左クリック(left)、右クリック(right)、中央ボタン(middle)を指定できます。

import pyautogui

pyautogui.click(x=100, y=200, clicks=2, interval=1.0, button='right')
doubleClick()

「doubleClick」は指定の座標位置をダブルクリックする操作です。
使用方法は、座標を指定すると、その位置をダブルクリックします。
また、省略可能ですが、「duration」、「button」も引数にあります。
「duration」はその時間をかけて指定の座標に移動します。。
「botton」は左クリック(left)、右クリック(right)、中央ボタン(middle)を指定できます。

import pyautogui

pyautogui.doubleClick(x=100, y=200, duration=0.5, button='right')
dragTo()

「dragTo」はドラックしたまま指定の座標に移動します。
使用方法は下記の様に、移動先の座標を指定すると、その座標にドラッグしたまま移動します。
省略可能ですが「duration」を指定すると、その時間をかけて対象の座標に移動します。
また、こちらも省略可能ですが、「botton」で左クリック(left)、右クリック(right)、中央ボタン(middle)を指定できます。

import pyautogui

pyautogui.dragTo(100, 200, duration=3, button='left')
dragRel()

「dragRel」はドラックしたまま指定の距離を移動させます。
使用方法は、「dragTo」とほぼ同じですが、マウスの移動は今いる位置から指定した距離の移動になります。

import pyautogui

pyautogui.dragTo(100, 200, duration=3, button='left')

【参考サイト】

今回の作業にあたり、下記サイトを参考にさせて頂きました。
pyautogui.readthedocs.io
bttb.s1.valueserver.jp
bttb.s1.valueserver.jp

【Python】ファイルやフォルダ名の操作や検索

この記事では、ディレクトリやファイルに関連した内容について記載していきます。
実施時の環境は以下です。

【一覧】

この記事に記載する処理について、使用するライブラリ毎に、一覧にまとめておきます。
今回使用するライブラリはPythonに標準的にあるライブラリのため、インストールは不要です。

ライブラリ:os.path

コード 説明
basename() ファイル名の取得
dirname() ディレクトリを取得
split() ディレクトリとファイル名に分割
splitext() ファイル名と拡張子に分割
join() 文字列をパス形式で結合
exists() パスが存在するか確認
isfile() ファイルが存在するか確認
isdir() ディレクトリが存在するか確認

ライブラリ:glob

コード 説明
glob() フォルダ内のファイルをリストで取得

【コードの説明】

ライブラリ:os.path

以下のコードはライブラリ「os.path」にある処理なので、使用する際は「os.path」をインポートしてください。

basename()

「basename」ファイルパスからファイル名を取得します。
使い方は下記の様に、引数にパスを渡すと、ファイル名が返されます。

import os.path

path = 'D:\\python\\testdir\\test.txt'

file_name = os.path.basename(path)
# file_name >> test.txt
dirname()

「dirname」はファイルパスからディレクトリ部分のパスを取得します。
使い方は下記の様に、引数にパスを渡すと、ディレクトリ部分が返されます。

import os.path

path = 'D:\\python\\testdir\\test.txt'

dir_name =  os.path.dirname(path)
# dir_name >> D:\python\testdir
split()

「split」はファイルパスをディレクトリとファイル名に分割したものを取得します。
使い方は下記の様に、引数にパスを渡すと、ディレクトリとファイル名が返されます。

import os.path

path = 'D:\\python\\testdir\\test.txt'

dir_file = os.path.split(path)
# dir_file >> ('D:\\python\\testdir', 'test.txt')
splitext()

「splitext」はファイルパスをファイル名(ディレクトリを含む)と拡張子に分割したものを取得します。
使い方は下記の様に、引数にパスを渡すと、ファイル名と拡張子が返されます。

import os.path

path = 'D:\\python\\testdir\\test.txt'

file_ext = os.path.splitext(path)
# file_ext >> ('D:\\python\\testdir\\test', '.txt')
join()

「join」は引数をパス形式で結合したものを取得します。
使い方は下記の様に、引数に文字列を渡すと、1つのパス形式が返されます。

import os.path

dir_name = 'D:\\python\\testdir'
file_name = 'test.txt'

path = os.path.join(dir_name, file_name)
# path >> D:\python\testdir\test.txt

渡す引数は、2つ以上であればいくつでも大丈夫です。

import os.path

dir_name_1 = 'D:\\python'
dir_name_2 = 'testdir'
file_name = 'test.txt'

path = os.path.join(dir_name_1, dir_name_2, file_name)
# path >> D:\python\testdir\test.txt
exists()

「exists」は引数のパス先が存在する場合「True」しないときは「False」を取得します。
使い方は下記の様に、引数にパスを渡すと、「True」or「False」が返されます。

import os.path

path = 'D:\\python\\testdir\\test.txt'
exist = os.path.exists(path)
# exist >> False

上記の例は存在しない場合です。

isfile()

「isfile」は引数のパス先のファイルが存在する場合「True」しないときは「False」を取得します。
使い方は下記の様に、引数にパスを渡すと、「True」or「False」が返されます。

import os.path

path = 'D:\\python\\testdir\\test.txt'

exist = os.path.isfile(path)
# exist >> True

上記の例は存在する場合です。

また、ファイルの存在を確認するため、ディレクトリを渡すと「False」になります。
下記の例では、フォルダは存在しますが、「False」が返されています。

path = 'D:\\python\\testdir'

exist = os.path.isfile(path)
# exist >> False
print(f'exist >> {exist}')
isdir()

「isdir」は引数のパス先のディレクトリが存在する場合「True」しないときは「False」を取得します。
使い方は下記の様に、引数にパスを渡すと、「True」or「False」が返されます。

import os.path

path = 'D:\\python\\testdir'

exist = os.path.isdir(path)
# exist >> True

上記の例は存在する場合です。
「isfile」とは逆で、ファイルパスを引数にするとFalse」になります。
下記の例では、フォルダは存在しますが、「False」が返されています。

import os.path

path = 'D:\\python\\testdir\\test.txt'

exist = os.path.isdir(path)
# exist >> False

ライブラリ:glob

以下のコードはライブラリ「glob」にある処理なので、使用する際は「glob」をインポートしてください。

glob()

「glob」はフォルダ内のファイルやフォルダ名をリストで取得します。
フォルダ内のみを取得する方法と、再帰的にサブフォルダを含めて検索する方法があります。

フォルダ内のみの取得方法が下記です。
検索したいフォルダに「\\*」をつけて引数にすると、フォルダ内のフォルダとファイルを全て取得して、リストを返します。

import glob

path = 'D:\\Python\\testdir'

file_list = glob.glob(path + '\\*')
# file_list >> ['D:\\Python\\testdir\\aaa', 'D:\\Python\\testdir\\test.txt']


フォルダ内のサブフォルダを含めた取得方法が下記です。
検索したいフォルダに「\\**」をつけて引数にし、「recursive=True」にするとサブフォルダを含めたフォルダ内内のフォルダとファイルを全て取得して、リストを返します。

import glob

path = 'D:\\Python\\testdir'

file_list = glob.glob(path + '\\**', recursive=True)
# file_list >>  ['D:\\Python\\testdir\\', 'D:\\Python\\testdir\\aaa', 'D:\\Python\\testdir\\aaa\\bbb.txt', 'D:\\Python\\testdir\\test.txt']

【参考サイト】

今回の記事の作成にあたり、下記サイトを参考にさせて頂きました。
note.nkmk.me
www.gesource.jp
note.nkmk.me

プライバシーポリシー

【プライバシーポリシー】

広告の配信について

当サイトは第三者配信の広告サービス「Googleアドセンス」を利用しています。(予定)
広告配信事業者は、ユーザーの興味に応じた広告を表示するために「Cookie(クッキー)」を使用することがあります。

Cookieを無効にする設定およびGoogleアドセンスに関して、詳しくはこちらをクリックしてください。

アクセス解析ツールについて】

当サイトでは、Googleによるアクセス解析ツール「Googleアナリティクス」を利用しています。
このGoogleアナリティクスはトラフィックデータの収集のためにCookieを使用しています。
このトラフィックデータは匿名で収集されており、個人を特定するものではありません。
この機能はCookieを無効にすることで収集を拒否することが出来ますので、お使いのブラウザの設定をご確認ください。
この規約に関して、詳しくはこちらをクリックしてください。

【当サイトへのコメントについて】

当サイトでは、スパム・荒らしへの対応として、コメントの際に使用されたIPアドレスを記録しています。
これはブログの標準機能としてサポートされている機能で、スパム・荒らしへの対応以外にこのIPアドレスを使用することはありません。
当サイトでは、次の各号に掲げる内容を含むコメントは管理人の裁量によって承認せず、削除する事があります。

・特定の自然人または法人を誹謗し、中傷するもの。
・極度にわいせつな内容を含むもの。
・禁制品の取引に関するものや、他者を害する行為の依頼など、法律によって禁止されている物品、行為の依頼や斡旋などに関するもの。
・その他、公序良俗に反し、または管理人によって承認すべきでないと認められるもの。

【 免責事項】

当サイトで掲載している画像の著作権・肖像権等は各権利所有者に帰属致します。権利を侵害する目的ではございません。
記事の内容や掲載画像等に問題がございましたら、各権利所有者様本人が直接メールでご連絡下さい。確認後、対応させて頂きます。
当サイトからリンクやバナーなどによって他のサイトに移動された場合、移動先サイトで提供される情報、サービス等について一切の責任を負いません。
当サイトのコンテンツ・情報につきまして、可能な限り正確な情報を掲載するよう努めておりますが、誤情報が入り込んだり、情報が古くなっていることもございます。
当サイトに掲載された内容によって生じた損害等の一切の責任を負いかねますのでご了承ください。

運営者:chappy88
初出掲載:2019年08月06日

【Python】CSVファイルの読み込み

【はじめに】

今回はPythonでのCSVファイルの読み込み方法についてのメモです。

<実施環境>

【コードと説明】

今回はライブラリの「csv」を使用しますので、インポートします。

import csv

ライブラリの「csv」はPythonに標準で入っているため、インストールの必要はありません。

<コード一覧>

コード 説明
ファイル.read() 全文を取得
csv.reader(ファイル) forと組み合わせで行毎にリストで取得
quoting=csv.QUOTE_NONNUMERIC readerの引数、データをfloatで取得
<全文を取得>
# ファイル.read()
file_path = './test.csv'

with open(file_path, mode='r') as f:
    print(f.read())
# => a,b,c,13,14
#    d,e,f,23,24

CSVファイルもテキストファイルと同様に「read()」で全文を読み込みできます。ただ、この方法だとこの後に文章を何らかの方法で加工していく必要があります。

<forと組み合わせで行毎にリストで取得>
# csv.reader(ファイル)
import csv
file_path = './test.csv'

with open(file_path, mode='r') as f:
    reader = csv.reader(f)
    text = [row for row in reader]

print(text)
# => [['a', 'b', 'c', '13', '14'], ['d', 'e', 'f', '23', '24']]

最初にライブラリの「csv」をインポートしています。
「open」を使ってファイルを読み込みモードで開きます。
「reader」に「csv.reader」クラスを入れています。
引数にはファイルオブジェクト(今回だとファイルを「f」として開いているので「f」)を指定しています。
取得値は行毎にリストとなった2次元配列になります。
上記のサンプルを見ると、各値が「''」囲まれていることがわかります。これは文字列として取得しているということです。
CSVファイルでは数値データを取得することもあるため、これでは使い勝手が悪いです。解決方法としては下記になります。

import csv
file_path = './test.csv'

with open(file_path, mode='r') as f:
    reader = csv.reader(f, quoting=csv.QUOTE_NONNUMERIC)
    text = [row for row in reader]

print(text)
# => [[11.0, 11.5, 1.05, 13.0, 14.0], [0.1, 0.2, 0.3, 23.0, 24.0]]

「reader」の引数に「# quoting=csv.QUOTE_NONNUMERIC」を入れることで取得値を全てfloat型で取得することができます。
上記例では「''」がついていないことがわかります。
ただし、データに数値以外が混ざっていると下記の様にエラーとなるため注意が必要です。

import csv
file_path = './test.csv'

with open(file_path, mode='r') as f:
    reader = csv.reader(f, quoting=csv.QUOTE_NONNUMERIC)
    text = [row for row in reader]

print(text)
# => Traceback (most recent call last):
#   File "D:/Python/EditDocumentProject/test.py", line 6, in <module>
#     text = [row for row in reader]
#   File "D:/Python/EditDocumentProject/test.py", line 6, in <listcomp>
#     text = [row for row in reader]
# ValueError: could not convert string to float: 'a'

【後書き】

今回はCSVファイルの読み込み方法について記載しました。
引数などもまだある様ですが、今回は使用しなかったため、また機会があれば調べたいと思います。

【参考サイト】

今回の作業にあたり、下記サイトを参考にさせて頂きました。
note.nkmk.me