なずブログ

インフラSE、Java開発、リモートワークエンジニアな人のメモ帳

AccessVBAのきっかけ~ExcelのBOOK間転記はテキスト挟むとたまに楽~

f:id:nazuna_0124:20170312082946p:plain

VBA書かなくなって随分立つけれどまだ覚えてるかなぁ。

やり始めたきっかけを思い出すのはなかなか楽しいです。


akashi-keirin.hatenablog.com

そんなところでお見かけしたこちらの記事。


あるExcelから他のブックに移動したいことはよくあります。

んで

よーく考えると大抵の場合でデータベース化したいってことがほとんどなんですよね。


Excelだといちいちbook開くの面倒。別に書き込み先は外でもいいじゃん。

ということで、Access>今のmysqlと流れていくわけです。


やりたいことを考えるとテキストを間に挟めるとむしろ楽なことがあるというお話。



しっかり真似をさせて頂いて。入力画面をこんなかんじ

Excelのバージョンは気にしちゃだめです f:id:nazuna_0124:20170312122941p:plain


つづいてソース

Sub writeTxt()
    Dim FSO As New Scripting.FileSystemObject
    Dim col As New Collection
    Dim PATH As String
    Dim SH As Worksheet
    
    PATH = ThisWorkbook.PATH & "\db.txt"
    Set SH = ThisWorkbook.Worksheets("Sheet1")
    
    col.Add "C3"
    col.Add "C5"
    col.Add "C7"
    col.Add "F3"
    col.Add "F5"
    col.Add "F7"
    
    Dim str As String
    
    
    For i = 1 To col.Count
        
        str = str & SH.Range(col(i)).Value & ","
        
    Next
    
    str = Left(str, Len(str) - 1) & vbCrLf
    
    FSO.OpenTextFile(PATH, ForAppending, True).Write (str)
End Sub


カンマ区切りの文字列にしちゃってテキストファイルに追加書き込みしちゃうのです。


※注意 該当テキストファイルを「メモ帳」で開きっぱなしのときは問題ないですが、エディタとかだとロックかかります

作ったコードをF5キーで連打すると

f:id:nazuna_0124:20170312123538p:plain

ウィンドウズのバージョンは気にしちゃだめですってば。


あとは適当に読み取りたい側のBookにテキストファイル読み取るものを作成。

Sub readTxt()
    Dim FSO As New Scripting.FileSystemObject
    Dim col As New Collection
    Dim PATH As String
    Dim SH As Worksheet
    
    
    PATH = ThisWorkbook.PATH & "\db.txt"
    Set SH = ThisWorkbook.Worksheets("Sheet2")
    
    
    Dim str As String
    
    str = FSO.OpenTextFile(PATH, ForReading).ReadAll
    
    
    Dim i As Long
    Dim k As Long
 

    Dim splRow
    Dim tageRow As Long
    
    
    tageRow = 2
    
    splRow = Split(str, vbCrLf)
    
    
    For i = 0 To UBound(splRow) - 1
        For k = 0 To UBound(Split(splRow(i), ","))
            SH.Cells(tageRow, k + 1).Value = Split(splRow(i), ",")(k)
        
        Next k
        tageRow = tageRow + 1
    Next
End Sub[f:id:nazuna_0124:20170312124329p:plain]


ふつうに読み取り結果。

f:id:nazuna_0124:20170312124329p:plain


テキストファイルへの読み書きは不思議な速さなので

覚えておくとたまに幸せになれますというお話でした!

PHPの基礎~一言掲示板ちっくななにか~

f:id:nazuna_0124:20170312082946p:plain

おはようございます!

昨日作るだけ作って更新しなかったので、さっそく更新。


プログラムの基本3構造+POSTだけで何か作れないか考えましたが、

やっぱりそれだとサーバーにある意味がありません


というわけで、テキストファイルに出力して読み込むタイプの処理です。


チャットや掲示板、CMSの原石みたいなかんじです。


テキストファイル書き込みテスト

画面はこんなかんじ。

f:id:nazuna_0124:20170312083534p:plain

ソースはこちら

<?php
    $inputName = '';

define("TXT_PATH","log.txt");

    //postがあったら書き込みする。
    if(!empty($_POST)){
        //文章作成
        $str[] = date('Ymd H:i:s');
        //$str[] = $_SERVER['REMOTE_ADDR']; //IPを表示しておきたいとき
        $str[] = $_POST['name'];
        $str[] = $_POST['text'];
        $str[] = "\r\n";

        file_put_contents(TXT_PATH,implode(",",$str),FILE_APPEND);

        //名前維持のために変数へ格納
        $inputName = $_POST['name'];
    }



    $getTxt = htmlspecialchars(file_get_contents(TXT_PATH),ENT_COMPAT);
    $getTxt = str_replace("\r\n","<br>",$getTxt);

?>

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>txt test</title>


</head>
<body>

    <form name="frm" action="" method="POST">
    名前
    <input name ="name" type="text" size="30" maxlength="255" value="<?php echo $inputName ?>">
    <p>
    本文
    <input name="text" type="text" size= "" maxlength="255">
    </p>

    <p>
    <input type="submit" value="送信">
    </p>

    </form>

    <br>

    <?php echo $getTxt;?>


    <script>
   window.onload= function(){
       if(document.frm.name.value == ''){
           document.frm.name.focus();
       }else{
           document.frm.text.focus();
       }
   }

</script>
    </body>
</html>

ファイルを書き込む処理として file_put_contents 使ってます。

ロックがどうなってるのかさっぱりわかりません

同時書き込みとかどうなるんでしょーね…


初めて使う時は名前にフォーカスがあたって、

本文入力後は本文側にフォーカスあたるようになってます


この手の使いやすさはとっても大事。チャットでは基本といえば基本ですけれど。


$text =['日付','名前','本文']

こーゆう配列を 「日付,名前,本文,」という風に

文字列に置き換えてくれるのがimplodeです。

他の言語だとjoinかな? 


PHPにもありますが非推奨なので注意


これが出来るといろいろできます。


テキストファイルで処理してるとこをデータベースにすればさらに!

PHPが好きになりました~PHP開発者のインタビューを見て

本日の授業はおやすみ。

めずらしく全くやる気がでません。


お休みもたまにはいいですよね(・∀・)


だらだらしてるところでPHPのなんとなく腑に落ちない部分を求めて

開発者インタビューをみてみました。

Rasmus Lerdorf氏インタビュー


すっごく平たく言うと

  • PHPは必要だから作った
  • 重要なのはどの製品が必要とされているか
  • 学術的に純粋であることと実用であることは関係がない。

いい加減な部分なのはこーゆう思想からも来てるのでしょねー。


なんというのでしょう。わたしは自分の作ったものの雑さを自分で責めてた口です。


VBAで業務改善した人はよくご存知かと思いますが、ほんとすごく喜ばれるんです。


でも、どれだけ感謝されても「こんなの使わせてごめんね」という思いはなかなか消えませんでした。

(今は吹っ切れてます)


その雑に作っちゃだめ、いい加減にやっちゃだめというマイルールを

破っているものを見せられるからPHPいやだったんだなーと再認識。


嫌いなものの原因は大抵自分にありますよね。

だから何が嫌いかで語るのが好きなのです。

職業訓練の授業44日目~PHPの初歩~

f:id:nazuna_0124:20170310221050p:plain

内容:連想配列、$_GET

10日くらい前に戻ってきたSQLペーパーテストですが

無事100点でした!


いや~ 簡単だったので満点じゃなかったらどうしようかと

逆に変なプレッシャーがかかってました…


78点のできのもので納期は2割引き

それがわたしのクオリティ。←満点は最初から諦める。


尚、納期が倍になっても点数は82点くらいにしか上がりません!



というわけで、わたしの最寄りのスクリプト言語PHPさん2日目です。


本日もわたしのノートより抜粋(テキストファイル

printf覚えれ

文字列の表現方法。ちょっと特殊だけれどC言語にはあるみたい。

var_dumpとprint_r

変数の中身確認。

IDE使わないならこれで確認するのが基本

連想配列が重要

PHPは何かあったらすぐ連想配列で返ってきます

曖昧にすると死んじゃうのできっちり覚えること!

変数の存在確認、中身確認

isset と empty。

$_GETへの値確認

コードの変数いじってどうこうするより

localhost/index.html?t=2017-03

こんなかんじでブラウザを直接いじっちゃうほうが楽です。


一通り知識を放り込んだところでフォーム作成。ここで


htmlspecialcharsさんきたー


これの引数ですがENE_QUOTESが基本かと思います。

| で区切って論理和を使うこともあるとかなんとか…

普通にちょっと何言ってるかわかりませんでした。


計算機系のフォーム作成

割り勘計算機を作成しました。

ここで覚えたいこと

  • 0で割るとエラーでる
  • $_GETの中身を確認しよう
  • input type=“number” で数値入力。でも過信注意。
  • actionで別ページに飛ばすほうが楽。同ページ表示はちょっと後。

制御文

お約束のif、for、while、switch


2日目で基本的なところはかなり進みました!

この時点で何か作れそーで・・・ちょっとむつかしい?

何か考えてみます。

初心者がコード書くときに考えてること~PHPでカレンダー~

f:id:nazuna_0124:20170309204724p:plain

本日の授業はおやすみです。

面接の選考があるのだそーな。どっきどきですね。


そんなわけで、昨日のカレンダーを作ってる最中に考えてたのはこんなこと。


このナメクジみたいな進み具合が、いつか微笑ましく思い出すときがくるといいな!


ナズナさんはツッコミ役。


(思考中)

なずな< (カレンダーかぁ。昨日やった九九表を応用できるかも?)

(おんなじく1~最終日まで表にすればいいんじゃないの?)


<コード作成中>

こんなかんじ

f:id:nazuna_0124:20170309192954p:plain


なずな< (今回はさっさとテーブルにしちゃおう。)

(列はともかく折り返しは・・・と。)

(1,8,14と増えてくから7で割って1余ったら行足すようにしよう。)

f:id:nazuna_0124:20170309192956p:plain


(思考中)

ナズナ< (カレンダーって曜日順だよね。1日の場所ずれるよ。どうするの?)

(あとその月以外の日付はどうする?カレンダーによるよ。)


なずな< (むぅ。ってことは表のマスは最大いくつだろ。7*6で42かな。)

(えーっと…。1日が日曜日だったら入りたい場所は1番。)


(日曜日の返り値は0だから… !)

(そっかー。単純に1日の曜日分だけズレるってことね!)

(前月、次月はとりあえず空白にする)


<コード完了>

空白行がつぶれちゃうのが難点。

f:id:nazuna_0124:20170309192958p:plain


(思考中)

ナズナ<(日曜日と土曜日は当然色変えるよね?)


なずな< (もちろん。ん~ 全部spanでくくってclass指定でなんとかしよう。)

(日曜はtrと一緒に処理して…。土曜日は7で割ったらあまりなしでオッケーかな)

(ついでにスタイル修正っと)


できあがったもの

f:id:nazuna_0124:20170309193000p:plain


(思考中)

ナズナ< (あたしはやっぱり、前月次月の日付が表示されるほうが好きだな~♪)

(もちろん灰色にしてね)


なずな< (むぐぐ。わたしもそう思う)

(前月からいこう。えーっと番地であるiは1から始まってる)

(初日が入るのは曜日の返り値…。そっか。iが曜日より小さいとこは前月だね)

(色はスタイル設定にしちゃえ)


なずな< (次月はおんなじ要領だよね)

(最終日+曜日が最終番地だからそこより大きい)

f:id:nazuna_0124:20170309193004p:plain


ナズナ<(祝日はー?)


なずな< (祝日ねー。Accessでやったことあるんだ)

(祝日って法改正で変わる日もあるの)

(だから1~2年分手動登録してもらうのが一番ましだった)

(今回は配列に入れて配列の存在確認でやっちゃうよー)


<コード作成中>

できあがったもの

f:id:nazuna_0124:20170309203405p:plain


(思考中)

ナズナ<(2017年3月はいいけど。振替休日どうする?)


なずな< (日曜が祝日だったらだよね。)

(仕方ない。前日が日曜かつ祝日じゃないかチェックする)


<コード作成中>

できあがったもの

  • テスト用に3/19を祝日として配列に格納
  • 変わらず3/20が赤くなるカレンダー

f:id:nazuna_0124:20170309203405p:plain


(思考中)

ナズナ< (まってまって。振替休日は火曜日でもなることあるよ!)


なずな< (そ、そうだった…。えー 延々ループするの? めんどくさーい)

(今年は振替休日あるのいつだろー。)→ぐぐる

(1月2日が振替休日なのね。)

(!? 振替休日って書いてる!)

(元々こういうサイトからコピペする仕様だし、なにもしなくていいじゃん!)

(コメントだけのこしとこ)


<なずなコメント記入>

  • 前日チェックを削除
  • コメントに振替休日をいれてねってお願いしとく。

完成

f:id:nazuna_0124:20170309012704p:plain



頭のなかにツッコミ役が存在する人わたしだけじゃないよね…?

プログラム初心者がPHPでカレンダーをつくってみました

f:id:nazuna_0124:20170306210455p:plain

できた・・・?



確認する限りでは出力はあってます


こんなかんじで表示したいのです。

f:id:nazuna_0124:20170309012704p:plain

ソースはこちら。習ったことだけを使って、ぐぐらない縛りです←

<?php

    $y ="2017";
    $m="5";

    $lastday=date("t",mktime(0,0,0,$m,1,$y));
    $weekday=date("w",mktime(0,0,0,$m,1,$y));

    $tbl = "";

    $tbl.='<table border="1">';

    $className="";


    //振替休日も祝日で登録してね。火曜日、水曜日が振替休日になる場合もあります。
    $holiday =[
    "2017/01/01"=>"元日",
    "2017/01/02"=>"振替休日",
    "2017/01/09"=>"成人の日",
    "2017/02/11"=>"建国記念の日",
    "2017/03/20"=>"春分の日",
    "2017/04/29"=>"昭和の日",
    "2017/05/03"=>"憲法記念日",
    "2017/05/04"=>"みどりの日",
    "2017/05/05"=>"こどもの日",
    "2017/07/17"=>"海の日",
    "2017/08/11"=>"山の日",
    "2017/09/18"=>"敬老の日",
    "2017/09/23"=>"秋分の日",
    "2017/10/09"=>"体育の日",
    "2017/11/03"=>"文化の日",
    "2017/11/23"=>"勤労感謝の日",
    "2017/12/23"=>"天皇誕生日",

];


    for ($i=1;$i<43;$i++){

        if ($i % 7 == 1){
            $tbl.= "<tr>";
            $className = 'class = "sunday"';
            }
        elseif($i % 7 == 0){
            $className = 'class ="saturday"';
        }else{
            $className='';
        }

        //祝日対応
        if(array_key_exists(date("Y/m/d",mktime(0,0,0,$m,$i - $weekday,2017)),$holiday)){
            $className='class = "sunday"';
        }


        $tbl.="<td>";

        if ($i <= $weekday || $i > $weekday + $lastday){
            $tbl.="&nbsp;";
            $tbl.= '<span style="color:gray">' . date("j",mktime(0,0,0,$m,$i - $weekday,2017)) . '</span>';

        }else{
            $tbl.="<span ${className}>" . ($i-$weekday) .'</span>';
        }

        if ($i % 7 == 0){
            $tbl.="</tr>";
        }
    }


    $tbl.="</table>";


    ?>


    <html>
    <head>

   <style>

    .sunday{
        color:red;
    }

    .saturday{
        color:blue;
    }

    table{
        text-align:center;
    }

    </style>
   </head>
    <body>

    <?php print date("Y年n月",mktime(0,0,0,$m,1,$y)) ?>
    <?php print tidy_repair_string($tbl) ?>
    <?php $tbl ?>

    </body>
    </html>

年月を引数で受け取って関数にすれば、たぶん使えなくも……。


なにかもっといいほうほうないかなー。


もしくはもうちょっと綺麗に書きたいものです。

職業訓練の授業~43日目~PHP初日

f:id:nazuna_0124:20170303232129p:plain

内容:なぜWebアプリなのか。PHP基礎。

皆さんお待ちかねのPHPの授業です。


休憩時間中に「なんか楽しくなってきた」

PHP覚えればなんでもできるんじゃ!?」



喜びの声が聞こえてきてます。


さて、何が好きかより何が嫌いかで語るのが好きな皆様こんにちわ。


実はhtmlspecialcharsを見た段階で

あ、この子とは長く付き合えないかも


若干心が折れかかってました。

当面はコード入力にVimを使うということで、さらに絶望的に。


PHPさんとのお付き合いは、検討させて頂いた後にお返事差し上げたいと存じます


などと言いつつ、AccessVBA使いの私はLAMP四天王に強い憧れがありました。

なんでかとゆーと、そりゃもうWebアプリ作れるからです。


授業はWebアプリケーションの概要と題して、なぜWebアプリなのかから始まりました。


目的がわからないと前に進めない私にとっては実にすばらしーすべりだし。


平たく言うと

みんなで一緒にたくさんのデータが使える!すごーい!


その分いろいろ覚えることが多い、 その中では比較的簡単というのがPHPのメリットでしょうか。


全体的にサクサクモードで進んでます。

今日で「'」と「"“」の使い分け、一部関数の紹介までいきました。


相変わらず記事の方向性を悩んでます。

今日のところはいつもどおり気になるところをあげてみます。

PHPの開発環境

VmwareLinux CentOSです。

他に候補が上がるのはXAMPPとvagrantでしょうか。

理解した上でないと簡単に環境をつくれても意味がないとも言えます。

ただプログラムに入るまでに時間がかかりすぎるのでケースバーケースですね。

Web作成用のユーザーを作成

Apatcheの公開ディレクトリなんかを変更。

localhost/~UserName

このURLで接続できるように設定。

セキュリティ面がメインでしょうか。ちょっと勉強不足なので調べてみます。

php.iniの編集

素の設定だとエラー表示が出ません

display_errosをOnにすればオッケーです。

こっそり知りませんでした。

自宅のeclipse+xampp環境では最初からなんか出てました。


どーもXdebugぽい???

開発環境とエディタ

今回のネックです。

Vimさんの特殊性も去ることながら

いまいち性能のPCでVmware上というのがきついです。

がんばって覚えても実際にこれでやる機会が不透明なのも心配。


早めにどうするか決めます。

カレンダー作成

ちょっと先の課題で出題予定だそうです。

聞くと作りたくなってきます

ちょっとこれから試してみまっす!