to_csv のencoding オプション

Python3 でリストをcsv として保存したものをExcel で開くと文字化けする件。read_csv でencoding を指定したのと同じものをto_csv のオプションに指定したら解決しました。

・
・
csv_name = "\price_data.csv"
data.to_csv(OUT_DIR + csv_name, encoding = 'sjis', index = False)

to_csv のencoding のデフォルトは ‘utf-8’ なので指定必須でした。

MS Office 2019のインストール

遅ればせながら、Office がバージョンアップして2019 になりPC2台までインストールできるオンラインコード版が買えるようにになったのでAmazon.co.jp でポチりました。

Microsoft Office Personal 2019 (最新 永続版)|オンラインコード版|Windows10|PC2台

インストールは簡単。Amazon.co.jp のサイトにログイン、ゲーム&PCソフトダウンロードライブラリのリンクから

[Office.comへ] のリンクをクリックしてインストレーションに従うだけです。

[次へ] をクリック。

[インストールする] をクリック。

Excel 2019 を起動。

特典の色々付いているOffice365 をなぜ買わないのかとお叱りを受けそうな所ですが、サブスクリプションは使わないと初期投資の元を取れないのがもったいないと思ったので・・・。機能は2016とあまり変わらないというか、変わらないところが扱いやすくて良いですね。

LibreOffice calc のマクロボタン

MS オフィス互換のLibreOffice calc ですが、MS Excel で書いた時刻表示のプロシージャを読み込むか、試みに実行してみました。

まず、セル”A1″=GETDATE() とユーザー定義関数を入力します。
[ツール]-[マクロ]-[マクロの管理]-[LibreOffice Basic…]から当該ブックの[standard]をクリックして[新規作成] で以下のプロシージャをコピペします。

Option VBASupport 1
Function GetDate() As Date
Application.Calculation = xlCalculationAutomatic
Application.Volatile
GetDate = Now()
End Function

Sub clock()
Dim counter As Long, crntAdd As String
Worksheets("sheet1").Activate
Worksheets("sheet1").Range("A1").Select

crntAdd = ActiveCell.address

Do Until crntAdd <> "$A$1"
If counter Mod 1000 = 0 Then
counter = 0
Worksheets("sheet1").Range("A1").Calculate
crntAdd = ActiveCell.address
DoEvents
End If
counter = counter + 1
Loop

End Sub

Private Sub フォーム_click()
Call clock
End Sub

[表示]-[ツールバー]-[フォームコントロール]から[コントロールツールバー]をポイントして「ツールバー」から「デザインモード」にします。

[フォーム]の挿入ボタンをクリックするとコントロールフォームが表示されます。(ちなみにボタンの名前変更は、右クリック→コントロール→全般タブ→タイトルから変えられます。)

「プッシュボタン」と書かれた[フォーム]を右クリックして[コントロール]から[イベント]-[実行時] の[…]をクリックして「アクションの割り当て」から「マクロセレクター」で[フォーム_click]マクロを割り当てます。

「デザインモード」を終了して名前を付けてブックを保存。[プッシュボタン]フォームをクリックすると時計が動きました。
難点は、MS Excel のthisworkbook.Activate が使えないことや、Workbook_Open という名前のプロシージャを作ると動作せず「マクロセレクター」から登録することなど不自由を感じました。
参考URL:

http://calibreblo.blogspot.jp/2011/05/blog-post.html

Excelのくし刺し演算

あまり使わない機能なので何度、検索しても忘れてしまうので困っています。

エクセルで同じ書式の複数シートの当該セルの合計を出したいとき、総合計シートのセルでΣ(SUM関数)を出して最初のシートのセルを選択、Shiftキーを押しながら最後のシートのタブをクリック。

ですよね。勉強になります。

参考URL http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1412189669

Excelでファイルリストを取得する

今日はVBAのお勉強です。[ミュージック]フォルダのアーティスト、アルバム、曲名をワークシートにリスト出力します。曲名ファイルがカレントディレクトリの2段下にあるので、For Each文を3回ネストしています。

Public Sub get_music_list()
  Dim Obj, f, g, h As Object
  Dim DirName as String
  Set Obj = CreateObject("Scripting.FileSystemObject")
  Set DirName = Environ("UserProfile") & "\Music"
  Dim i, j As Long
  i = 1: j = 0
  
  For Each f In Obj.GetFolder(DirName).SubFolders
    For Each g In Obj.GetFolder(DirName & "\" & Obj.GetFolder(f).Name).SubFolders
        ActiveSheet.Cells(1, i).Value = Obj.GetFolder(f).Name
        ActiveSheet.Cells(2, i).Value = Obj.GetFolder(g).Name
        For Each h In Obj.GetFolder(DirName & "\" & Obj.GetFolder(f).Name & "\" & Obj.GetFolder(g).Name).Files
            ActiveSheet.Cells(3 + j, i) = h.Name
            j = j + 1
        Next h
        i = i + 1
        j = 0
        Set h = Nothing
    Next g
    Set g = Nothing
  Next f
  i = 0
  Set Obj = Nothing
  Set f = Nothing
End Sub

http://www.moug.net/tech/exvba/0060001.html
http://vba-geek.jp/blog-entry-52.html

ちなみにPowerShellでは、同じ様なことを以下のコマンドで可能です。

>cd $HOME\Music
>Get-ChildItem -Recurse -Name >C:\src\music.txt

http://www.atmarkit.co.jp/ait/articles/0808/22/news129.html

Excelで年齢を計算

Excelの日付フォーマットは色々あって覚えるのは大変ですが、セル選択して[Ctrl] + [1] からセルの書式設定を開いて、[表示形式]タブ → [日付]を確認すると良いです。

例)
【西暦】1971/8/13
【和暦】S.46.8.13

年齢はDATEDIF関数を使って以下の式で計算できます。

A2=1971/8/13
B2=DATEDIF($A2,TODAY(),"Y")

第3引数は、開始日($A2)から終了日(TODAY())までの期間を年数で表示するオプションです。

datedif

ExcelのRAND,RANDBETWEEN関数でランダムなSSIDを作る

きっかけは、Kasperskyインターネットセキュリティがたびたび「自宅のWiFi[SSID]は安全ではありません。」みたいなアラートを表示していたのでWiFiのセキュリティについて考えていたことです。

検索してみると、ルーターの暗号方式をWEPからWPA2にする、SSIDをブロードキャストしない設定にする、パスワードを複雑なものにするなどといったありきたりのことでしたが、もしかしてデフォルトのSSIDがいけないのかとExcelでランダムなSSIDを作ろうと思いつきました。

さあ、数字6文字と英字6文字の12桁のSSIDをRAND関数で作ってみよう。

まず、[A1]から[A26]まで1~26の数字をCtrl+オートフィルで、[B1]から[B26]までA~Zまで手入力でテーブルを作ります。

次に、[D1]から[D12]まで1~12の数字を、[E1]に以下の数式を入力して[E6]までをオートフィルして、アルファベット6文字の乱数を作ります。

=VLOOKUP(RANDBETWEEN(1,26),$A$1:$B$26,2)

次に、[E7]に以下の数式を入力して[E12]までオートフィルして数字6文字の乱数を作ります。

=RANDBETWEEN(0,9)

これで12文字の乱数ができました。次に[G1]から[G12]まで=RAND()をオートフィルして、[H1]から[H12]までを以下の数式をオートフィルして重複しないランダムなインデックス(順序数)を作ります。

=RANK(G1,$G$1:$G$12)

最後にDE列のテーブルで作った乱数を、H列のインデックス順にI列でVLOOKUPして[I12]までオートフィルします。

I1=VLOOKUP(H1,$D$1:$E$12,2)

後は[F9]キーを何回か押して好きな英数列が出来るまで再計算すれば出来上がり。

randamSSID

ポイントは、以下URLにもありますがRAND関数で作った乱数にRANK関数で重複のない順序を与えてあげるところですね。

参考URL http://office-qa.com/Excel/ex205.htm