Hatena::ブログ(Diary)

はけの徒然日記 このページをアンテナに追加 RSSフィード

2005 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 04 | 05 | 08 | 09 | 10 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 10 | 11 |
2011 | 01 | 02 | 03 | 04 | 11 | 12 |
2012 | 02 | 03 | 05 |
2014 | 02 | 03 | 04 | 05 | 12 |
2015 | 05 | 07 | 08 | 09 | 10 | 11 | 12 |
2016 | 01 | 02 | 04 | 05 | 08 | 09 | 11 | 12 |
2017 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 10 |
2018 | 02 | 03 | 04 | 05 |

2018-04-06(Fri)

python - numpyの初歩

numpyの基本的機能確認

python のバージョンは 3.6.4

import numpy as np

# listとndarrayの相互変換
a = [[1,2],[3,4]]
b = np.array(a)
print(repr(b)) # array([[1,2],[3,4]])
c = b.tolist()
print(c)       # [[1,2],[3,4]]

# データ型
print(b.dtype)  # int32
# 次元
print(b.ndim)   # 2
# 要素数
print(b.size)   # 4
# 行列数
print(b.shape)  # (2, 2)

# ndarrayの生成
a = np.arange(8, dtype=int) # end, type
print(repr(a))        # array([0, 1, 2, 3, 4, 5, 6, 7])
a = np.arange(1,19,2) # begin, end, step
print(repr(a))        # array([ 1,  3,  5,  7,  9, 11, 13, 15, 17])

# 行列構成変更
b = a.reshape((3,3))  # tupleで指定
print(repr(b))        # array([[1, 3, 5],[7, 9, 11],[13, 15, 17]])

# スライス
print(b[0])        # [1,3,5]
print(b[0][0])     # 1
print(b[0,0])      # 1
print(b[0][:2])    # [1,3]
print(b[1:])       # [[7, 9, 11],[13, 15, 17]]
print(b[1:][:2])   # [[7, 9, 11],[13, 15, 17]] これは上手くいかない


# 等間隔な数列
a = np.linspace(0,2,5)# start,end,size
print(repr(a))        # array([0. , 0.5, 1. , 1.5, 2. ])
a = np.linspace(0,2,5,endpoint = False)
print(repr(a))        # array([0. , 0.4, 0.8, 1.2, 1.6])

# 乱数
a = np.random.random(4) # 要素数(0 <= n < 1.0)
print(repr(a))          # array([0.44478423, 0.87792819,
                        #        0.35577869, 0.05965164])
a = np.random.randint(0,10,5) # begin,end,size
print(repr(a))          # array([7, 5, 8, 0, 1])

# ソート
b = np.sort(a)
print(repr(b))          # array([0, 1, 5, 7, 8])
b = np.sort(a)[::-1]    # 降順
print(repr(b))          # array([8, 7, 5, 1, 0])

c = np.argsort(a)       # index順を返す
print(repr(c))          # array([3, 4, 1, 0, 2], dtype=int32)
print(repr(a[c[:]]))    # array([0, 1, 5, 7, 8])
                        # indexを参照してソート

# 多次元ソート
a = np.random.randint(0, 10, (3,2))
print( repr(a) )           # array([[4, 0],[8, 3],[1, 5]])
print( repr( np.sort(a) )) # array([[0, 4],[3, 8],[1, 5]])
                           # axis=-1で各行を個々にソート
print( repr( np.sort(a, axis = 0) )) 
                           # array([[1, 0],[4, 3],[8, 5]])
                           # 各列を個々にソート

# 四則演算
a = np.array([1,2,3])
b = np.array([4,5,6])
print( repr(np.add(a,b)) )       # array([5, 7, 9])
print( repr(np.subtract(a,b)) )  # array([-3, -3, -3])
print( repr(np.multiply(a,b)) )  # array([ 4, 10, 18])
print( repr(np.divide(b,a)) )    # array([4. , 2.5, 2. ])

# 各種計算
print( np.sum(a) )       # 6
print( np.mean(a) )      # 2.0
print( np.max(a) )       # 3
print( np.min(a) )       # 1
print( np.var(a) )       # 0.6666666666666666 分散
print( np.all(a) )       # True 全て真
print( np.any(a) )       # True 何れかが真

# 行列の積
a = np.array([[1,2],[3,4]])
b = np.array([[5,6],[7,8]])
print( repr(a.dot(b)) )  # array([[19, 22],[43, 50]])

# 転置行列
a = np.arange(1,5).reshape((2,2))
print(repr(a))                 # array([[1, 2],[3, 4]])
print(repr(a.T))               # array([[1, 3],[2, 4]])
print(repr(np.transpose(a)))   # array([[1, 3],[2, 4]])

# 0行列
a = np.zeros((2,2), dtype=int)
print(repr(a))        # array([[0, 0],[0, 0]])

# 1行列
a = np.ones((2,2), dtype=int)
print(repr(a))        # array([[1, 1],[1, 1]])

# 単位行列
a = np.identity(3, dtype=int)
print(repr(a))        # array([[1, 0, 0],[0, 1, 0],[0, 0, 1]])

2018-03-18(Sun)

EXCEL VBAメモ - ユーザーフォームを常に最前面にする(Excel2016)

背景

職場PC現在Windows7 Excel2010の環境統一されていて、そこで以下のようなExcelマクロ使用している。

  1. マクロ付ブックを起動する
  2. 同時にユーザーフォーム自動で(VbModelessオプションにて)起動する
  3. 対象ブックを開く(この時ユーザーフォーム最前面に表示されている)
  4. 対象ブックに対し、ユーザーフォーム操作しながら作業を行う。

Excel2016での問題点

ユーザーフォーム操作すると、マクロ付ブックがアクティブになり、対象ブックが隠れてしまう。また、対象ブックをアクティブにすると今度はユーザーフォームが隠れてしまう。

これは、Excel2013以降でExcel自体が変更になった結果みたい。

でも、これでは今後Windows10等に環境移行した際に、作業に支障でまくりなので何等かの対策必要となる。


ユーザーフォームを常に最善面にくる様にする方法

標準モジュールに以下を追加(64bit用のコード

Public Const SWP_NOMOVE = &H2
Public Const SWP_NOSIZE = &H1


Public Const HWND_TOP = 0
Public Const HWND_BOTTOM = 1
Public Const HWND_TOPMOST = -1
Public Const HWND_NOTOPMOST = -2


Public Declare PtrSafe Function SetWindowPos Lib "user32" _
    (ByVal hWnd As LongPtr, _
        ByVal hWndInsertAfter As LongPtr, _
        ByVal X As LongPtr, _
        ByVal Y As LongPtr, _
        ByVal cx As LongPtr, _
        ByVal cy As LongPtr, _
        ByVal uFlags As LongPtr) As Long


Public Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" _
    (ByVal lpClassName As String, _
        ByVal lpWindowName As String) As Long

ユーザーフォームに以下を追加

Private Sub UserForm_Initialize()
    Const C_VBA6_USERFORM_CLASSNAME = "ThunderDFrame"

    Dim ret As Long
    Dim formHWnd As Long

    'Get window handle of the userform
    formHWnd = FindWindow(C_VBA6_USERFORM_CLASSNAME, Me.Caption)
    'If formHWnd = 0 Then Debug.Print Err.LastDllError

    'Set userform window to 'always on top'
    ret = SetWindowPos(formHWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE)
    'If ret = 0 Then Debug.Print Err.LastDllError

    Application.WindowState = xlMinimized ' この操作は必須

End Sub

ただしこれでも、ユーザーフォーム操作後に、対象ブックのセルを選択しなおす等の操作をする際に、一旦対象ブックを選択しなおすという作業必要なので、Excel2010と完全に同じ操作手順というようにはいかない。


参考サイト

2018-02-18(Sun)

PowerShell - バッチファイル内に記述したスクリプトを実行する。

バッチファイル内にPowerShellスクリプトを記述して実行させる方法を知ったのでメモ

この方法だとExecutionPolicyに関係なく実行できる様なので、普段PowerShellを使用していないPCでも実行可能になる。


参考サイト


記述方法

バッチファイル1行目に以下を記述し、2行目以降にはPowerShellスクリプトを記述する。コマンドライン引数は$argsで取得できる。

@setlocal enableextensions enabledelayedexpansion & set "SELF=%~f0" & PowerShell.exe -Command "& (Invoke-Expression -Command ('{#' + ((Get-Content '!SELF:'=''!') -join \"`n\") + '}'))" %* & exit /b !errorlevel!

# 以下実行させたいPowerShellスクリプト

構造

  • バッチコマンドを&で連結して1行で記述
  • バッチファイルのパスを取得し、ローカルな環境変数SELFに格納
  • PowerShell.exe -Command Script %* でスクリプト実行
  • exit /bでバッチ終了

PowerShell.exe -Command Scriptの内容

  • Get-Contentで環境変数SELF(バッチファイル自身)の内容取得(この際「'」を「''」に置換)
  • 取得した内容(行単位の配列)を改行コードで連結してひとつの文字列にする
  • 頭に#を追加して、バッチファイル1行目を(PowerShellの)コメントにする
  • Invoke-Expressionで実行