2019年3月27日水曜日

とある規格化されたコード

世の中こんなもんまで規格化されていますよ、というお話
https://ja.wikipedia.org/wiki/ISO_5218

この辺が大変良くできた、ためになる(?)解説記事です。(長い
https://qiita.com/aoshirobo/items/32deb45cb8c8b87d65a4
暇つぶしにどうぞ。

色々と議論になったときにISOの責任に転嫁できるということだけが最大の利点です。

ISO5218という数字を記憶しておけば(いつ来るかわからないけど)いざというときにドヤ顔できます!

2018年11月7日水曜日

IIS上に素の.htmlファイルを公開するだけで500(Internal Server Error)エラー

<症状>

IIS上に素の.htmlファイルを公開したらアクセスの最初に500エラーが発生。
再読込をすると正常にアクセス可能。
という症状が発生。

再読込をすると正常にアクセスできたので気にしてなかったら客先から指摘されてしまった。いろいろ弄ってると一定時間経つと「最初だけ500エラーが発生」の状況に戻ることがわかった。

Apache1.3の頃から使っていた者としてはナカナカ不思議な現象。
仮想ディレクトリ作ってhtmlファイル置いてるだけなんですけど。
まぁ、IISですからいろいろあるわな、と。

環境は以下の通り。
WindowsServer2012R2
IIS8.5

客向けのDEMOサイトのためHTML、CSS、JSのみのプレーンな作り。
サーバーサイドは.NetもPHPもASPも何もなし

<調査>

アクセスログによるとステータス500
sc-status:500
sc-substatus:19

とのことで

IIS 7.0、IIS 7.5、および IIS 8.0 の HTTP 状態コード


なんかを見ると
500.19 - 構成データが無効です。
とのこと。

....htmlファイル公開するだけなのにweb.configが要るんか!?
ってことでとりあえず空に近い以下のようなweb.configを設置。
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.web>
    </system.web>
</configuration>
でも症状は変わらず。

<対応>

ググってググってグーグル先生もネタ切れの模様を呈してきたとこで
「アクセス権」の文字列を発見(残念ながら該当サイトは失念)

というわけで仮想ディレクトリとして指定した元のディレクトリを確認すると
IUSRの指定はあったけどIIS_IUSRSの指定が無いという
おなじみの状態につき、IIS_IUSRSにフルアクセスをくれてやった。
(アプリケーションプールユーザは追加せず)

数時間置いて確認を3度ほど繰り返し無事問題解決したことにした。

<その後>

とりあえず社内で報告を書いたところ「Blogに残しといてくれ」との依頼により、この記事の執筆に至る。

この記事を書くために、アクセスしたサイトをもう一度巡ったり、置いといたweb.configとってきたりする中で、上記の「sc-status」、「sc-substatus」の文字列が欲しかったのでもう一度アクセスログを開き、ヘッダ文字列をコピペ。

すると....

#Fields: …中略… cs(Referer) sc-status sc-substatus sc-win32-status time-taken

????
「sc-win32-status」ナニコレ?美味しいの?

該当のログは
sc-status sc-substatus sc-win32-status
500 19 5

とあったので
sc-status:500
sc-substatus:19
sc-win32-status:5
ってことらしい。

ということでググってみる

System Error Codes (0-499)
ERROR_ACCESS_DENIED
5 (0x5)
Access is denied.
Access is denied!
Access is denied!!

チュドーン!\(^o^)/

(500.19に文句を言いたい気持ちをぐっと抑えて)
ログはしっかり確認しましょうというあまり面白くもないオチと教訓でした。

2014年8月29日金曜日

(VB.NET)Windowsフォームから既定のブラウザを立ち上げてGoogle検索

需要ありそうで以外とサンプルが無い。

至って簡単。だからサンプルが無いのかもしれない 

※ボタンクリック時に既定ブラウザ立ち上げてテキストボックスの中身で検索するサンプル。
    Private Sub btnGGL_Click(sender As System.Object, e As System.EventArgs) Handles btnGGL.Click
        If Me.txt_workp.Text.Trim = "" Then Return
        Process.Start("https://www.google.co.jp/search?q=" & HttpUtility.UrlEncode(Me.txt_workp.Text.Trim))
    End Sub


検索した中身が取りたいとかFormアプリ上に表示したいとかそうゆうゼータクなご要望は WEB Search API とか WebBrowserクラスとか使えばいいと思うよ


2014年8月15日金曜日

(VBA)2D折れ線グラフのエラーバーにユーザー設定の値を設定する

グラフがいっぱいあると画面からポチポチやるの大変 
マジ腱鞘炎
        

  Dim bk As Workbook: Set bk = Workbooks("3rdData_AR2MN_グラフ.xlsx")
  Dim s As Worksheet: Set s = bk.Worksheets("data_all_AR2MN(p2)")
  Dim co As ChartObject
  Dim i As Long: i = 0
  
  Dim sumR As Long: sumR = 72
  Dim r  As Range: Set r = s.Range("E" & CStr(sumR))
  
  For Each co In s.ChartObjects
  
    Dim sc As Series: Set sc = co.Chart.SeriesCollection(1)
    Dim am(1) As Variant
    am(0) = r.Offset(0, i).Value
    am(1) = r.Offset(0, i + 1).Value
    
    sc.ErrorBar xlY, xlErrorBarIncludeBoth, xlErrorBarTypeCustom, am, am
    
    i = i + 3
    
  Next

sumRは合計行の位置で、要素が3列づつあるのでi+=3になってます。 
こまけーことはお気になさらずに。。。

(VBA)ある条件に合致したグラフのタイトルをまとめて書き換える

シート名で判別してグラフのタイトルをまとめて設定するテスト
        
Sub hoge()

  Dim bk As Workbook: Set bk = Workbooks("3rdData_p2_グラフ.xlsx")
  Dim s As Worksheet 
  
  Dim co As ChartObject, ch As Chart
  Dim buf As String
  
  For Each s In bk.Worksheets

    If InStr(1, s.Name, "AtRisk") > 0 Then

      For Each co In s.ChartObjects
        
        Set ch = co.Chart
      
        ch.HasTitle = True
        buf = ch.ChartTitle.Text
        
        ch.ChartTitle.Text = Replace(buf, "良好群", "Risk群")
            
      Next
      
    ElseIf InStr(1, s.Name, "malnu") > 0 Then

      For Each co In s.ChartObjects
      
        Set ch = co.Chart
      
        ch.HasTitle = True
        buf = ch.ChartTitle.Text
        
        ch.ChartTitle.Text = Replace(buf, "良好群", "危険群")
            
      Next

    End If

  Next

End Sub
つーかよ全部同じ名前にすんじゃねーよ確認しろよ

2012年10月26日金曜日

【VBA】Meってなんだ

今月2本目のUP、良いペースです。 おはよう御座います。部長です。
 皆様いかがお過ごしでしょうか?僕はイカが釣れません。






 で、

 今日は、アオリイカ用の新しいエギを25本買ったのでそのレビュー
じゃなくて、EXCELマクロを書く時にハマりがちな「Me」の取り扱いについてです。


これ。



「Me」英語で「私」。
プログラムをやっている人にはMeだのThisだのSelfだのでお馴染みだと思うのですが、
VBAで自動記録マクロから入るとあまり使う機会はありません。
あまり馴染みが無い割に、ちょっと込み入ったマクロを書こうとするととても大事な概念なのです。

「Me」とは、自分自身を示す修飾語です。

画像の例でいくと、Sheet1モジュールに対しての「Me(私)」ですから、Sheet1そのものを示します。
要するに、WorksheetObjectです。

ということは、標準モジュールでこうやって書くのと一緒です。

        
Sub selectSheet1A1()
  ThisWorkbook.Worksheets("Sheet1").Range("A1").Select
End Sub

同様に、ThisWorkBookモジュールでMeであればそれは自身のWorkBookオブジェクトを示します。

なんでコレが大事なのよ?当たり前じゃないよ?と思われるかも知れません。

下は、自動保存したマクロです。

        
Sub Macro1()
'
' Macro1 Macro
'

'
    ActiveCell.FormulaR1C1 = "1"
    Range("B4").Select
    ActiveCell.FormulaR1C1 = "2"
    Range("B5").Select
    ActiveCell.FormulaR1C1 = "3"
    Range("B6").Select
    ActiveCell.FormulaR1C1 = "4"
    Range("B7").Select
    ActiveCell.FormulaR1C1 = "5"
    Range("B3").Select
    Range(Selection, Selection.End(xlDown)).Select
    Range("B3:B8").Select
    Range("B8").Activate
    ActiveCell.FormulaR1C1 = "=SUM(R[-5]C:R[-1]C)"
    Range("B3:B8").Select
End Sub
自動保存だけに要らんコードが満載・・・

マクロの内容は、B2~B7に1,2,3,4,5と入れて、B8でSUMしています。結果15ですよ的な。

        
    Range("B4").Select
    ActiveCell.FormulaR1C1 = "2"

これで、B4を選んで、アクティブなB4に2って入れろという記述がしてありますが、
Rangeの頭には何もついていません。
実は、「ActiveWorkbook.ActiveSheet.」が省略されているのです。

これの何が恐ろしいかって、
例えば1行目から100行目までぐ~るぐ~る回しながら各列のセルを更新するような時間の掛かる処理を流している最中に、

「あ、時間かかるから別の作業しよう」

なんて別のワークシートをアクティブにした途端、
「ActiveWorkbook.ActiveSheet.」は切り替えた後のシートが対象となります。

そして、恐ろしいことにマクロでの実行結果はUNDO(Ctrl+Z)が効きません。
結果として、元のシートでは期待した結果が得られず、切り替えたシートでは最悪マクロによりデータが書き換えられてしまうのです・・・

そこで、「誰」に対してその処理を行うのか?を意識する事が大切なのです。
「Me」は自分自身に処理をしますよ、という修飾語です。
別のシートに対して処理をするのであれば、そのシートですよ!という修飾語が必要です。

Sub selectSheet1A1()
  ThisWorkbook.Worksheets("Sheet2").Range("A1").Select
End Sub
こんな。


「ThisWorkBook」を他のブックで指定すれば、別のブックを操作する事も可能です。

ちょっと込み入ったマクロを作る時は、意識してみて下さいね。


じゃ、イカ釣り行ってきます。

2012年10月24日水曜日

【Excel】繰り返しセルの値を更新する時のパフォーマンスアップ

こんにちは。部隊長です。
秋ですが飽きもせずExcelネタ。色々寒風寒々しくなってまいりました。

まず、Excelでセルに値を入れる時、ループで1セルずつ処理すると大変遅うございます。

こんなの。100行×100列処理
        
dim r as range, i as long, j as long
set r = thisworkbook.workshees("sheet1").range("a1")
for i = 0 to 100
  for j = 0 to 100
    range.offset(i,j).value = hoge
  next
next
処理時間は1秒弱でしょうか? ScreenUpdating = False を使えばほぼ気にならないですが、 実際のプログラムだとこのループの間に計算式や他のセル参照などが入っていたりしてどんどん重くなってしまっていると思います。

そこで・・・

値を予め二次元配列に入れて、同じ大きさのRANGEに貼り付けるととても速いのです。

こんな感じ
        
dim r as range, i as long, j as long
dim ary(100,100) as variant
set r = thisworkbook.workshees("sheet1").range("a1")
for i = 0 to 100
  for j = 0 to 100
    ary(i,j) = hoge
  next
next

r.resize(i+1,j+1) = ary


マクロが遅くてお困りの方、お試しください!

2012年8月16日木曜日

[Excel]簡単相関分析とt検定

こんにちは!残暑厳しいですが如何お過ごしですか?
自転車通勤してたら焼けすぎで遊びすぎに思われている部隊長です。
子供より黒いです。まずい。

また最近学術的な方面のお仕事をやらせて頂いているので、
復習も兼ねてExcelで相関分析とその検定方法について書いてみます。

[相関分析とは]
2つの要素に関連性があるのかどうかを調べます。
関連性とは、ある要素xが増えた時に、別の要素yも同じように増える傾向がある、とか。

[t検定とは]
2つの要素の関連性だけでは、標本数が少ない場合などに偶然関連性が強く出てしまうことや
逆に弱く出てしまう事があります。
そこで、2つの要素の平均値に統計的に明らかな差があるかどうかを調べることで、その相関関係も統計的に意味があると言える。のだそうです。たぶん。

[どんな時につかうの]
まず、2つの要素が数値の時。(ある、なしなどの選択肢や、1-2-3位などの順位では、別のやり方をします)
例えば・・・暑い夏にうまい冷えたビールを飲んだ量と、でた(?)量が相関するかどうか・・・

経験上相関しますけど。


1. データを準備!




2. プロットして相関関係を表示

(1)データエリアを選択して、挿入→散布図 
(2)レイアウト→近似曲線→線形近似曲線
(3)近似曲線を右クリック→近似曲線のオプション→グラフにR-2乗値を表示する
とすると、下のようなグラフが出来上がります。


※その他、式を表示したり好みでマーカーの色を変えたりしてます。

先ほど表示にチェックしたR-2乗値。これが2つのデータ間における、相関関係を表す値となります。

1に近づく程相関関係が強いですので、かなり強力に相関していますね。

やっぱり飲んだら出るんです。



3. t検定の実施(=TTEST(データ1,データ2,片側/両側,検定の種類))

空いているセルに「=TTEST(」と打ち込んで、第一引数に「のんだ」データ
第二引数に「でた」データを選択。
第三引数は、今回平均値の差が多くても少なくても関係無いので「両側分布」の2を選択。
第四引数は、等分散を検定していないのでWELCHの検定(非当分散を仮定)である3を選択。



・
・
・
すると、関数の結果としてp値が計算されます。
・
・
・


結果は0.000477(0.0477%)で、危険率1%未満です。
飲んだビールの量とでた(?)量には統計上有意差があり、関係が無いことが棄却され
やっぱり飲んだら出る(?)ことが証明されました!



※この実験結果はフィクションです。実際に測った(?)わけではありません!


サンプルファイルをコピー


記事とは全く関係ないですが、弊社は来月9/10より下記所在地へ移転致します。
移転後も変わらぬご愛顧、ご指導ご鞭撻を賜りますよう、社員一同お願い申しあげます。

【新事務所住所】
〒104-0032
東京都中央区八丁堀2丁目1-7白鳳ビル2階
TEL:03-5542-0642
FAX:03-5542-0643




大きな地図で見る

2012年7月17日火曜日

.NET カスタムコントロールの日付型初期値

こんばんは。部隊長です。 暑すぎてエアコン全開にしても32度しか下がりません。ECOです
本日もまたハマってしまったシリーズです。


環境はVB.NET NULLを許容するDataTimePickerを参考に、未入力が可能な日付コントロールを作成しているのですが、 
未入力時の初期値が何故か"2012/2/8"になっている事象が発覚(ずっとモヤモヤしていたのだがウヤムヤにして逃げt)

しかし初期値をもつプロパティを用意していて、Enter時に_isnullならMyBase.Valueを置き換えるようにしているのにも関わらず、まったく置き換わらない。なぜだ。
ソリューションの.Designer.vbファイルを見てみると・・・

        Me.cdtp_DateOpen.DefVal = New Date(2012, 2, 8, 0, 0, 0, 0)
これか・・・

作戦1。
    Public Property DefVal As Date = DateTime.Today
ダメ・・・

作戦2
    Public Sub New()

        ' この呼び出しはデザイナーで必要です。
        InitializeComponent()

        ' InitializeComponent() 呼び出しの後で初期化を追加します。
        Me.DefVal = DateTime.Today '<-これ
        
        AddHandler Me.Enter, AddressOf setDefaultValue

    End Sub
またダメ・・・くそう

作戦3
    Protected Overrides Sub InitLayout()
        MyBase.InitLayout()
        Me.DefVal = DateTime.Today '<-これ
    End Sub
ダメ・・・なんでー!

ここで、プロパティのDefaultValueAttributeを思い出す。 ・

・

・

・

・

…orz



長くなったので結果からいくとコレでいけました
  <categoryattribute("data")> _
    <defaultvalue("")> _
    Public Property DefVal As Date

日付型にキャストできないから当日日付になった・・・?


単に技術力の低さを露呈する記事にしかなっていないのはキニシナイ


また!

2012年5月21日月曜日

2012年4月20日金曜日

2011 年 10 月以降に公開された Excel 2007 の更新プログラムを適用すると表示通りに印刷できない

2011 年 10 月以降に公開された Excel 2007 の更新プログラムを適用すると表示通りに印刷できない



な、なんだってーーー!!!(AA略



今晩は。無隊長です。

表題の件、今年3月のMSサポートなのですが、これは困った。

なんでって医療関係者の方々から大絶賛されているMNA®スターターキットExcel版に影響するじゃないか。



今のところ当事象に関する修正パッチはまだリリースされておらず、
回避方法は該当のアップデートを削除する、との事です。

Hotfixは出てまして、弊社Excel2007環境では正常動作を確認しておりますが、
一般ユーザー様へはあまりお勧めできません。
(ちゃんとテストされてないから解決するかどうかわからないし余計ぶっ壊れるかもよと脅し文句が書いてあるものなので)

MSからの修正パッチを待ちましょう・・・

2012年4月13日金曜日

【.NET】WindowsFormをドラッグした時に半透明にする

こんにちは!部長です。
最近お仕事の引き合いを多く頂いております。ありがたやありがたや(´人`)
新年度に入り心機一転、がんばりましょう。弊社の決算は9月ですので新下半期ですが。

スクラッチの業務APって色気無いですよね。殺風景というか。
弊社のクライアント様で、デザイン性に非常にこだわっておられるところがあるのですが、
そのお陰で社内プロダクトにもいろいろと見た目にも気にするようになってきました。

その一環で、某パッケージAPで、ドラッグされているウィンドゥが半透明になっているものがあり、
弊社製品にもパク実装してみました。

こんな感じ
    ''ドラッグ中に半透明
    Private Const WM_MOVING As Integer = &H216
    Private Const WM_EXITSIZEMOVE As Integer = &H232
    Protected Overrides Sub WndProc(ByRef m As Message)

        Try
            If m.Msg = WM_MOVING Then
                Me.Opacity = 0.8
            ElseIf m.Msg = WM_EXITSIZEMOVE Then
                Me.Opacity = 1.0
            End If
            MyBase.WndProc(m)
        Catch ex As Exception
            throw
        End Try
    End Sub

ボタンダウンとアップのタイミングでやったらなんかうまくいかなかったのでWM_MOVINGとWM_EXITSIZEMOVEで
今のところ正常動作中。。。

2012年3月23日金曜日

【.NET】ColorオブジェクトをSQLServerに保存する

随分と間が開いてしまいました。BS部隊長です。
これからはちょっと頑張ってPOSTしようと思います今日この頃。

最近は.NETによるクライアントAPの案件が多いのですが、
そこでユーザーごとにテーマカラーを保存して、表示する時に背景やら前景やら色変えたり変えなかったりしたらいいよねというアイデアがありまして、

至極単純な話なのですが、あれ?どうやるんだ?と暫く悩んだのでネタにしてみます。
あ、保存先はSQLServerです。2008R2。2012弄りたい。



で、どうやろうかと悩んで出した案


案1.Colo.Nameを文字情報で持つ(FromNameメソッドで復元)
->ブレンドした色は持てない
案2.XMLに書きだして保存
->めんどくさい
案3.intの配列に変換してvarcharで保存
->めんど(ry


結果から言ってしまうとColor.ToARGBというメソッドが既に準備されててintegerに変換して保存します。超簡単。時間返せ。

コード
**修正**2012・03・24(ToARGB使ってなかった・・・orz) 

private _color as integer
''' 
    ''' 色ボタンクリ
    ''' 
    ''' ''' ''' 
    Private Sub cbt_Color_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cbt_Color.Click
        If Me.ColorDialog1.ShowDialog() = DialogResult.OK Then
            _color = Me.ColorDialog1.Color.ToARGB
            Call setGradation(Me.cbt_Color, _color, _color)
        End If
    End Sub

    ''' 
    ''' ボタン内色■変えるよ
    ''' 
    ''' ''' ''' ''' ''' 
    Private Sub setGradation(ByRef btn As ccButton, ByVal fcol As Integer, ByVal tcol As Integer, Optional ByVal direction As Drawing2D.LinearGradientMode = Drawing2D.LinearGradientMode.ForwardDiagonal)
        Dim bmp As Bitmap = New Bitmap(btn.Width, btn.Height)
        Dim g As Graphics = Graphics.FromImage(bmp)
        Dim gradBrush As New Drawing2D.LinearGradientBrush( _
            g.VisibleClipBounds, _
            Color.FromARGB(fcol), _
            Color.FromARGB(tcol), _
            direction)
        g.FillRectangle(gradBrush, g.VisibleClipBounds)
        gradBrush.Dispose()
        g.Dispose()
        btn.Image = bmp
        btn.Refresh()
    End Sub



Enjoy!

2011年7月7日木曜日

高齢者の栄養スクリーニングツールMNAガイドブック 発売中です



高齢者に適した栄養スクリーニングツールであるMNA(Mini Nutritional Assessment)の本格的な書籍
「高齢者の栄養スクリーニングツールMNAガイドブック」が医歯薬出版社様より発売されました!

当社が開発・サポートを行なっております「MNA スターターキット」のCD-ROMが付属しています。
是非お試しください!
(利用にはExcel2000~2010のいずれかが必要です。Windows版のみ。)




MNA®て何?
6項目からなる栄養状態を把握するシートです。(ショートフォームの場合。)
詳しくはネスレ日本株式会社 ネスレニュートリションカンパニー様のWEBサイトをご参照下さい。

※医療従事者、関係者向けのサイトなので、詳細なページへの直接リンクはご容赦下さいm(__)m



Excelを用いたシステムのご相談、ツール開発、その他諸々、ご相談下さい!(∩´∀`)∩

2011年6月27日月曜日

Excel2010ってば・・・shapeがずれる!

Excel2010だと、他のバージョンに比べてShapeが右にずれる!

なので、Excel2010の場合、Shapeを左に3ポイントずらして描画することで対応するけど、
なんだか納得いかねぇ~なぁ~。

Excel2007だと印刷される罫線がExcel2010だと印刷されないんだよね。

まさか、Windows7の仕業(プリンタドライバ)じゃなかろう・・・・な・・・そこまで変わるか!?
ぬぬぬ・・・

印刷時にExcel2010の罫線が歯抜けになる現象

Excel2010の場合、印刷時に罫線が歯抜けになる事象が発生。
なんだよ・・・勘弁してくれよ・・・・

当然、2003と2007は正常に出力されるんだよね。
色の指定とかも疑ったのだが、試してみても印刷されない。
ほんと、頼むよぉ~、Excel。

で、ネットを漁っていたらヘッダーフッターの印刷が無ければ?OKだそうな。

今回は、フッターに画像を入れて印刷していたのだが、それをはずしてみた。
すると・・・・
罫線が印刷できたよ・・・
ほんと、勘弁してくれよなぁ・・・
なぁ~に、この仕様・・・
仕方ないので、フッターは使わずに画像を貼り付けることにするわ。

2011年6月10日金曜日

[Excel]シートを別ブックに保存する

こんちは。部隊長です。
梅雨でジメジメの蒸し暑暑ですが元気に行きましょう。寒いより暑いほうが好きです。女子は薄着になるし。

今回もまたExcelVBAで芸がないのですが、30分考えたので書き起こします。

そもそもあるシートを新規ブックとして起動させるには、

Dim sht as WorkSheet
Set sht = ThisWorkbook.Worksheets("対象のシート")
sht.Copy

これだけ。
対象シートが非表示の場合、Copyメソッドが失敗しますので、
ブックの保護解除とシートの可視化も導入

Dim sht as WorkSheet
Set sht = ThisWorkbook.Worksheets("対象のシート")
ThisWorkbook.Unprotect Password:=BKPWD
sht.Visible = True
sht.Copy
sht.Visible = False
ThisWorkbook.Protect Password:=BKPWD

この新規ブックを別名で保存するには、CopyするとWorkBooksがAddされたのと同じ状態になりますので、

'' 最後のブックを別名で保存
Workbooks(Workbooks.Count).SaveAs newFileNm, FileFormat:=xlNormal

します。ActiveWorkBookでもいいですが、Copyの後にActiveが動くような事があると・・・

というわけで全体のコードはこんな感じ。CSV形式での保存も対応しています。

Sub SaveAsOtherName

 Dim newName As String
 newName = _
     Application.GetSaveAsFilename( _
          InitialFileName:="デフォのファイル名" _
        , FileFilter:="エクセルファイル(*.xls),*.xls" & _
         ",CSVファイル(*.csv),*.csv" _
        , FilterIndex:=1 _
        , Title:="保存先の指定" _
        )

 If newName = "FALSE" Then Exit Sub
 If Dir(newName) <> "" Then
     If MsgBox("同名のファイルが存在します。上書きしてもよろしいですか?", Title:=MSGBOX_TITLE, Buttons:=vbYesNo) <> vbYes Then
         Exit Sub
     End If
 End If

 Dim sht As Worksheet: Set sht = ThisWorkbook.Worksheets("コピー対象シート名")

 ThisWorkbook.Unprotect Password:=BKPWD
 sht.Visible = True
 sht.Copy
 sht.Visible = False
 ThisWorkbook.Protect Password:=BKPWD

 Application.DisplayAlerts = False

 '' 新ファイル名称の拡張子で保存形式を判定しています。
 If CheckExtension("xls", newName) Then
     Workbooks(Workbooks.Count).SaveAs newName, FileFormat:=xlNormal
 Else
     Workbooks(Workbooks.Count).SaveAs newName, FileFormat:=xlCSV
 End If

 ActiveWorkbook.Close

 Application.DisplayAlerts = True

 MsgBox "保存しました", Title:=MSGBOX_TITLE
 
End Sub



divirta-se!

2011年5月28日土曜日

Softbankガラケーの画像が表示されない!?

灰皿なうのガラケー対応してから、Docomo、auは画像が確認できたんだけど、Softbankのガラケーだけ、うまくmapが取れていなかったことが、カミさんの携帯で判明。
この原因がわからん。

1件、探してヒットしたのが、3G以前のものはgif形式だとダメでjpgならOK、というもの。
早速、画像の形式を変更してみたけど(こんな感じ&format=jpg)うまく表示されない。

それで、さらに検索していると、同じようなQAを発見。
それによると、GooglemapAPIのバージョンによる記述式が異なり、v1の形式で記載しているからでは?とのこと。
あれ?そもそもv2って出てたの?と情弱ぶりを発揮しながらv2の構文で記述。

んー、出た出た。表示された。
なるほどね、こういうことだったのね。

v1とv2の違いにより変更した箇所はこんな感じ。
・最初んとこ
 V1の場合:<img src='http://maps.google.com/staticmap?
 V2の場合:<img src='http://maps.google.com/maps/api/staticmap?center=
・マーカーの設置
 V1の場合:marker=緯度,経度,色
 V2の場合:markers=color:色|緯度,経度

という話。

2011年5月26日木曜日

[訂正]Excelでカイ二乗検定

昨日の記事に誤りがありました。
最初のクロス集計表で、総合計欄が20の固定値になっておったんですな。
SUMに修正致しました。

正しくは下記の通りです。



確率としては4%に上昇しましたが、まだ5%未満で有意ですね。


しかし不思議なことに、総合計欄を動かすとCHITEST関数の結果も変わるんです。
この関数では合計欄見てないのに。。。なぜだろう?


サンプルファイルをダウンロード

2011年5月25日水曜日

[Excel]簡単カイ二乗検定

こんにちは。部隊長です。
最近統計処理を行う事が多いものですから、復習も兼ねてやり方を書いてみます。

【カイ二乗検定とは?】
クロス集計の結果が、統計的によくある事なのか否かを検定します。
これによって、カテゴリー毎の独立性が立証されるわけです。

【どういう時に使うの?】
例えば前日に酒を飲んだ人たちと、飲まなかった人たちで翌日の起きた時間帯に差があるのかどうかー
なんて事が統計的にわかります。


では、やり方。


1.クロス集計表を準備
検定を行いたいクロス集計表を準備します。




2.期待値を計算
このクロス集計表の期待値を計算します。
期待値とは・・・この例で言うと飲んだ人と飲んでない人を寝坊した人と寝坊してない人の割合で分けた値です。



飲んでなくて寝坊した人の期待値は、「寝坊した人の数×飲んでない人の数÷全体」となります。
これを4つのセルにそれぞれ貼り付けて、値を出します。


3.カイ二乗値を計算
カイ二乗値とは、実測値と期待値のズレを表します。
このズレが統計上の信頼確率範囲内ででるものか、そうでないかを検定するのが今回のゴールです。


各セルごとに「(実測値-期待値)の二乗÷期待値」で算出し、総和がこのクロス集計表のカイ二乗値となります。


4.確率を検定する
求めたカイ二乗値はカイ自乗分布に従います・・・ってなんのこっちゃですね。
詳しくはこちらを見ていただくとして、求めた値がどれくらいの確率で出現するものなのかを算出する関数が「CHIDIST(x,自由度)」です。


今回のクロス集計表は2×2マスですから、自由度は「(行の数-1)×(列の数-1)」で1となります。
算出された確率は・・・0.038 → 3.8%の確率となるわけです。
統計上、信頼確率範囲は用途により95%だったり99%だったりしますが、95%とするのであれば、このクロス集計表の結果から、酒飲んだ人と飲んでない人が寝坊するかどうかは関係が無い事が棄却された事になり、要するに飲んだら寝坊するみたいよ。有意に。って事になるのです。
・・・まどろっこしい。



・

・

・




5.もっと楽に確率を算出する =CHITEST(実測,期待値)


えっ?


カイ二乗値も自由度もいらない・・・



結論:理屈は大事。

とある規格化されたコード

世の中こんなもんまで規格化されていますよ、というお話 https://ja.wikipedia.org/wiki/ISO_5218 この辺が大変良くできた、ためになる(?)解説記事です。(長い https://qiita.com/aoshirobo/items/32deb...