MW211 EXIT

devlog
PHP配列/改造array_diff()
2013年11月30日
配列['a', 'b', 'b']と配列['b']の差分を比較したい場合。

「array_diff(array('a', 'b', 'b'), array('b'))」ってやると
結果が、配列['a']のみとなってしまう。

要素が複数ある場合には、その数に応じて差分を取りたいという場合
つまり、結果が配列['a', 'b']であって欲しい場合には「array_diff()」は使えない。

ということで、自前でそれを実現する関数を作ってみた
┌──────────────────────────────────────┐
│function array_diff2($return, $delete) {                                    │
│    if (is_array($return) && is_array($delete)) {                           │
│        foreach ($delete as $data1) {                                       │
│            foreach ($return as $key2 => $data2) {                          │
│                if ($data2 === $data1) {                                    │
│                    unset($return[$key2]);                                  │
│                    break;                                                  │
│                }                                                           │
│            }                                                               │
│        }                                                                   │
│    }                                                                       │
│    return $return;                                                         │
│}                                                                           │
└──────────────────────────────────────┘
分類:PHP配列
jQuery/Ajaxサブ画面からのダウンロード
2013年11月28日
Ajaxでサブ画面をはめ込んだとして、そこにファイルダウンロードボタンが
あったならば、このボタンを使えるものとできるのか?

答えは簡単にできる

呼び出される側で、以下を最初に出力してファイルの中身をその次に標準出力する。
┌──────────────────────────────────────┐
│header('Content-Disposition: attachment; filename="ダウンロード.txt"');     │
│header('Content-Type: application/octet-stream');                           │
└──────────────────────────────────────┘
一種の盲腸線みたいなもんだから画面表示はせずexit()で終わらせてしまう。

で、ダウンロードボタンでは「location.href=」でそれを指定するだけでよい。

Ajaxでダウンロードファイルを取ってきて、それを渡してみたいな仲介はいらない。

紐づけてやれば(紹介してやれば)、それでOK。バッファはいらない。

┌──────────────────────────────[download1.htm]┐
<html>
<head>
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8"/>
<meta http-equiv="Content-Script-Type" content="text/javascript"/>
<script type="text/javascript" src="jquery.js"></script><!-- ★jQuery -->
<script type="text/javascript">
$(function() {
    $.get(
        'download2.php',
        function(data) {
            $('#sub').html(data);
        }
    );
});
</script>
<title>ダウンロード画面</title>
</head>
<body>
<div id="sub"></div>
</body>
</html>
└──────────────────────────────────────┘
┌──────────────────────────────[download2.php]┐
<?php
if (isset($_GET['dl'])) {
    header('Content-Disposition: attachment; filename="download.txt"');
    header('Content-Type: application/octet-stream');
    echo 'ダウンロードファイルの中身です';
} else {
    echo <<<___HTML___
<input type="button" value="ダウンロード実行"
 onClick="location.href='download2.php?dl';"/><br/>

___HTML___;
}
└──────────────────────────────────────┘
分類:jQuery
PHP/ダウンロード画面の雛型
2013年11月27日
PHPにてダウンロード画面を実装する場合のシンプルな雛型。
┌──────────────────────────────────────┐
<?php
if (@$_POST['command'] == 'ダウンロード実行') {
    header('Content-Disposition: attachment; filename="download.txt"');
    header('Content-Type: application/octet-stream');
    echo 'ダウンロードファイルの中身です';
} else {
    echo <<<___HTML___
<html>
<head>
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8"/>
<title>ダウンロード画面</title>
</head>
<body>
<form method="post" action="">
<input type="submit" name="command" value="ダウンロード実行"/><br/>
</form>
</body>
</html>

___HTML___;
}
└──────────────────────────────────────┘

実はPOSTを使わなくても実現できたりする。
┌──────────────────────────────────────┐
<?php
if (isset($_GET['dl'])) {
    header('Content-Disposition: attachment; filename="download.txt"');
    header('Content-Type: application/octet-stream');
    echo 'ダウンロードファイルの中身です';
} else {
    echo <<<___HTML___
<html>
<head>
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8"/>
<title>ダウンロード画面</title>
</head>
<body>
<a href="?dl">ダウンロード実行</a><br/>
</body>
</html>

___HTML___;
}
└──────────────────────────────────────┘
分類:PHP
ExcelVBA/行着色・列着色
2013年11月25日
セル「A1」が属する行を赤に着色。
┌──────────────────────────────────────┐
│Cells(y, 1).EntireRow.Interior.Color = RGB(255, 0, 0)                       │
└──────────────────────────────────────┘

セル「A1」が属する列を赤に着色。
┌──────────────────────────────────────┐
│Cells(y, 1).EntireColumn.Interior.Color = RGB(255, 0, 0)                    │
└──────────────────────────────────────┘
分類:ExcelVBA
ExcelVBA/行削除・列削除
2013年11月24日
セル「A1」が属する行を削除。
┌──────────────────────────────────────┐
│Cells(1, 1).EntireRow.Delete                                                │
└──────────────────────────────────────┘

セル「A1」が属する列を削除。
┌──────────────────────────────────────┐
│Cells(1, 1).EntireColumn.Delete                                             │
└──────────────────────────────────────┘
分類:ExcelVBA
ExcelVBA/セルの内容の採取
2013年11月22日
フォルダに当該マクロをもつExcelファイルを置き、
まわりのExcelファイルの特定のシートの特定のセルの内容を取得する。
┌──────────────────────────────────────┐
│Sub 特定シートの特定セルを取得()                                            │
│    Dim y As Long                                                           │
│    Dim strBook As String                                                   │
│    Range(Columns(1), Columns(2)).Clear                                     │
│    y = 0                                                                   │
│    strBook = Dir(ThisWorkbook.Path & "\*.xls")                             │
│    Do While strBook <> ""                                                  │
│        If strBook <> ThisWorkbook.Name Then                                │
│            y = y + 1                                                       │
│            Cells(y, 1) = strBook                                           │
│            Cells(y, 2) = ExecuteExcel4Macro("'" _                          │
│                        & ThisWorkbook.Path & "\" _                         │
│                        & "[" & strBook & "]シート'!R1C1")                  │
│        End If                                                              │
│        strBook = Dir()                                                     │
│    Loop                                                                    │
│End Sub                                                                     │
└──────────────────────────────────────┘
シート名が決まっているのなら「ExecuteExcel4Macro()」で
手軽にできてしまう。

シート名が不定の場合は、シート一覧を取得してどうしてこうしてが
必要となってくるため「CreateObject()」を使うことになりそう。
「ExecuteExcel4Macro()」だけで完結できると速いのだけどね。
分類:ExcelVBA
ExcelVBA/ハイパーリンクの追加削除
2013年11月19日
選択した範囲の文字列をハイパーリンクとして設定してしまうマクロ。
┌──────────────────────────────────────┐
│Sub ハイパーリンク作成()                                                    │
│    Dim r As Range                                                          │
│    For Each r In Selection                                                 │
│        ActiveSheet.Hyperlinks.Add Anchor:=r, Address:=r.Value              │
│    Next                                                                    │
│End Sub                                                                     │
└──────────────────────────────────────┘
URL一覧とかで、実行すればリンク集となる。

選択した範囲のハイパーリンクを削除するマクロ。
┌──────────────────────────────────────┐
│Sub ハイパーリンク削除()                                                    │
│    Dim r As Range                                                          │
│    For Each r In Selection                                                 │
│        r.Hyperlinks.Delete                                                 │
│    Next                                                                    │
│End Sub                                                                     │
└──────────────────────────────────────┘
元々、ハイパーリンクを削除した場合、手動で削除しても
罫線が消えてしまうというバグがあるが、このマクロでも手動を代行するだけなので
罫線が消えてしまうので注意。
分類:ExcelVBA
ExcelVBA/列幅自動調整
2013年11月18日
以下の通り。
┌──────────────────────────────────────┐
│Cells.EntireColumn.AutoFit                                                  │
└──────────────────────────────────────┘

以下のようにすればブック内全部のシートについて行うことができる。
┌──────────────────────────────────────┐
│Dim wSheet As Worksheet                                                     │
│'列幅を揃える                                                               │
│For Each wSheet In Worksheets                                               │
│    wSheet.Cells.EntireColumn.AutoFit                                       │
│Next                                                                        │
└──────────────────────────────────────┘
分類:ExcelVBA
PHP/(追記)formの飛び先パスについての注意
2013年11月17日
formタグのactionパラメータに、飛び先のURLを指定する場合、
それがファイルではなく、ディレクトリであった場合には
しっかり末尾に「/」をつけてあげなければならない。
┌─┬────────────────────────────────────┐
│×│<form method="post" action="/abc">                                      │
├─┼────────────────────────────────────┤
│○│<form method="post" action="/abc/">                                     │
└─┴────────────────────────────────────┘

さもないと、「301転送」が発生してしまう。
┌─┬────────────────┬───────────────────┐
│×│… "POST /abc HTTP/1.1" 301 …  │301 Moved Permanently(転送)           │
├─┼────────────────┼───────────────────┤
│○│… "POST /abc/ HTTP/1.1" 200 … │200 OK(正常)                          │
└─┴────────────────┴───────────────────┘
「301転送」が起きるとどうなるのか?POSTの中身が消えてしまう(引き継がれない)

(といっても、そうならないパスがあったりするから厄介だ)


つまり、formタグの「/」がないだけで、いくらsubmitしても
受信側で$_POSTでデータを拾えないという怪奇現象が発生してしまうのだ。
(といっても、そうならないパスがあったりするから、ますます怪奇現象だ)

【追記】
実はmod_rewriteを使っている場合の話だった。
abcを画面コントローラ名として扱っている場合、
htdocs配下に「abc」というフォルダがあると、
一旦「abc/」に「301転送」がされてしまう。

例えば「manual」というフォルダ配下にマニュアルのpdfか何かを格納しつつ
「Manual」というマニュアル画面の画面コントローラ名を使用すると
「/Manual」は、mod_rewriteが動作する前に、「manual」というフォルダに反応して
「/manual/」に「301転送」され、POSTが空っぽになってしまうわけだ。

教訓
・画面コントローラ名とフォルダ名は同じにしてはいけない
・フォルダ名を末尾の「/」なしで指定すると「301転送」される
分類:PHP
ExcelVBA/ヘッダフッタ設定いろいろ
2013年11月15日
印刷直前にマクロを実行してヘッダフッタを自動設定する例。
┌──────────────────────────────────────┐
│Option Explicit                                                             │
├──────────────────────────────────────┤
│Private Sub Workbook_BeforePrint(Cancel As Boolean)                         │
│    Dim o As Object                                                         │
│    For Each o In ActiveWorkbook.Sheets                                     │
│        With o.PageSetup                                                    │
│            .LeftHeader = "&""MS ゴシック""&09" & "印刷日付:&I&B&D"       │
│            .CenterHeader = "&""MS ゴシック""&09" & "&Eタイトル &S嘘"     │
│            .RightHeader = "&""MS ゴシック""&09" & "印刷時間:&I&B&T"      │
│            .LeftFooter = "&""MS ゴシック""&09" & "ファイル名:&U&B&F"     │
│            .CenterFooter = "&""MS ゴシック""&09" & "ページ:&B&P/&N"      │
│            .RightFooter = "&""MS ゴシック""&09" & "シート名:&B&A"        │
│        End With                                                            │
│    Next                                                                    │
│End Sub                                                                     │
└──────────────────────────────────────┘
一通り揃っていると思われる。

まずは、以下のプロパティに値を入れることにより所定の位置に出力となる。
┌────────────┬─────────────────────────┐
│.PageSetup.LeftHeader   │左上ヘッダ                                        │
│.PageSetup.CenterHeader │中上ヘッダ                                        │
│.PageSetup.RightHeader  │右上ヘッダ                                        │
│.PageSetup.LeftFooter   │左下フッタ                                        │
│.PageSetup.CenterFooter │中下フッタ                                        │
│.PageSetup.RightFooter  │右下フッタ                                        │
└────────────┴─────────────────────────┘

次に「"&""MS ゴシック""&09"」は、
「MS ゴシック」のフォントサイズ「9」の指定となる。

「&」定数は以下のとおり。
┌─┬────────────────┐┌─┬────────────────┐
│&A│シート名                        ││&B│太字(で修飾)                    │
│&D│日付                            ││&E│二重下線(で修飾)                │
│&F│ファイル名                      ││&I│斜文字(で修飾)                  │
│&N│総ページ数                      ││&S│取消線(で修飾)                  │
│&P│ページ                          ││&U│下線(で修飾)                    │
│&T│時間                            │└─┴────────────────┘
└─┴────────────────┘
分類:ExcelVBA
前へ 1 2 次へ