カテゴリ:VBA( 20 )
朝日新聞の 特定秘密保護法案のアンケート結果を分析する
概要
現在、朝日新聞が特定秘密保護法案のアンケートを行っている。
賛成、反対、日本の安全が脅かされているか否かが選択でき、コメントも入力できる。

今回は、コメントを形態素解析して、反対・賛成、日本の安全が脅かされているか否かのそれぞれの立場で、使用する単語にどのような特徴がでるか調べるものとする。

Excelによる形態素解析が必要なので、NMecbComを以下からダウンロードしてインストールすること。
NMecabを用いてVBAやWSHで形態素解析を行なう


以下に集計を行ったExcelを添付する。

Excel analyzeAsapi.xlsm



More
[PR]
by mima_ita | 2013-11-28 18:55 | VBA
Excel VBA でニコニコ動画のコメントを取得する
Excelを使ってニコニコ動画のコメントを取得します。
これにより、粘着質な工作員や、嫌われるコメント、好まれるコメントの分析や、動画の盛り上がるタイミングの確認などができると思います。

Excelsimplemessage.xlsm

必要なもの
・Office2010 Excel
・ニコニコ動画のアカウント(可能ならプレミアム)
・ゆっくり待つ心と多少の障害を気にしない広い心

■使い方
1. 調べたい動画のsmXXXXのアドレスをしらべます。
b0232065_2240359.png



今回は、sm9068558の動画を調べます。
コメント数は3941件です。

30万件のコメントを取得しようとするとExcelが落ちるので、訓練された視聴者のいる動画では厳しいです。
2,3万件までは正常に取得できました。

2. ニコニコ動画にログインするのに使用するメールアドレスとパスワードを入力して、1の動画の番号を入力します。




「最近のメッセージ取得」または「全部のメッセージ」のボタンを押してください。
最近のメッセージは1000件までしか取得できませんが、プレミアム会員でなくても使用で着ます。
全部のコメントを取得したい人は銭っこ払ってプレミアム会員さなってください。

3.どちらかのボタンを押すとニコニコ動画からメッセージを取得します。
エラー処理があまいので、ネットワークの調子が悪かったりすると、落ちたりします。

4.取得結果をワークシートに貼り付けます。プレミアムは全件、それ以外は1000件までとなります。
b0232065_2253133.png


注目すべき項目は次のとおりです。
Vpos:
コメント書き込み位置 (1/100秒)です。これが集中しているシーンはユーザーになんらかの感動をあたえたシーンであると判断できます。

Mail:
文字の修飾や下表示、上表示などのコマンドです。
コメント職人に注目する場合はこの項目の値を見るといいでしょう。
184は次のユーザーIDを隠すコマンドです。


UserId:
ユーザーIDです。粘着している奴や自演している奴を探しましょう
ただし、184コマンドで送信(デフォルト)している場合は、一時的なIDで、特定のタイミング(1週間程度?)でリセットされます。
なので、別動画のユーザーIDはあてにならない可能性があります。

Score
NG共有機能に使用されるスコアです。
NGに指定されると0からどんどん下がっていきマイナスになります。マイナスの
自分のスコアが低くても泣かないようにしましょう。

Nicoru
最近できたの機能の「にこる」です。
人の共感をよぶコメントです。


あとはExcelをつかっていろいろ分析してください。
ニコニコ動画のAPIが正規に公開されているものではないと思うのでいきなり動かなくなる可能性は大いにあります。

2013/11/23
 コミュニティー動画を取得できるように修正
 メールアドレスが入っていない状態で、メッセージの取得をしたら入力を促すように修正
 各種グラフ追加

■参考
ニコニコ動画・ニコニコ生放送のコメント取得 備忘録
http://blog.livedoor.jp/mgpn/archives/51886270.html


ニコニコ動画のコメントを取得するAdd Star
http://d.hatena.ne.jp/MOOOVe/20120229/1330512626
[PR]
by mima_ita | 2013-11-28 08:53 | VBA
配列を経由したセルの値設定の副作用
セルを設定する場合に、以下のように配列を経由する方法があります。

    Dim buf(1 To MAX_ROW, 1 To MAX_COL) As Variant
    Dim r As Long
    Dim c As Long
    For r = LBound(buf, 1) To UBound(buf, 1)
        For c = LBound(buf, 2) To UBound(buf, 2)
            buf(r, c) = r & "," & c & ":" & TEST_STRING
        Next c
    Next r
    Sheet1.Range(Sheet1.Cells(1, 1), Sheet1.Cells(UBound(buf, 1), UBound(buf, 2))).Value = buf

この書き方を紹介しているページの多くは「速度がはやくなる」とだけ書いてあります。
しかし、この書き方の弊害については触れていないと思います。

数倍以上の速度を得るのと引き換えに、配列の分だけメモリを消費します
使用する場合は、どっちを優先するか考えてつかいましょう。



More
[PR]
by mima_ita | 2013-11-27 22:56 | VBA
ニコニコ動画のコメント操作に関する解説
■目的
ニコニコ動画のコメント操作に関する解説をします
以下の動画で紹介したツールの実装の説明になる。





More
[PR]
by mima_ita | 2013-11-27 17:14 | VBA
VBAで文字のescapeとunescapeを行なう
通信を行なう際に、JavaScriptのescape関数は英数字以外の記号や日本語を%21とか%u3044というユニコードのコードに変換してくれる。

VBAでそんな便利な機能はないか?
標準でそんざいしないようだが、外国のNice guyが実装してくれた。

http://www.xtremevbtalk.com/showthread.php?t=152882

あなたが、日本語とか漢字を使わなければこれで十分だろう。
しかし、日本で使うなら、残念ながら修正しなければならない。

そこで日本語でも使えるように改造しよう。

escape and unescape for VBA


このコードがオリジナルと異なる点は以下のとおりだる。
 ・AscW,ChrWを使用してUNICODEに対応している。
  ASCだと、システム規定の文字(日本語ならCP932)
  AscWだと、UNICODEにある。
  http://support.microsoft.com/kb/404928/ja
 ・ユニコードに変換する際に、"%u"という接頭語を付与する。
[PR]
by mima_ita | 2013-11-20 22:04 | VBA
TracのチケットからMsProjectのタスクをインポートする
■概要
Tracのチケットを用いて、MsProjectのタスクを作成する。

ダウンロード
http://needtec.sakura.ne.jp/vba/msproject.zip

手順
1.TracLighning 3.0 で作成したtracがある。
チケットのカスタムフィールドは下記のとおり
b0232065_23295070.png


2.prjSample.mppを起動を行い、「ImportTaskFromTrac」を実行する。

3.接続先のTracのログイン情報を入力してImportをする
b0232065_23322760.png


4.MSProjectのタスクが作成される
b0232065_233306.png


More
[PR]
by mima_ita | 2013-11-15 23:39 | VBA
MsProjectをVBAで操作する
■概要
MSProjectはVBAを用いて操作することができる。

今回使用した2010版は以下から評価版がダウンロードできる。
Office Professional Plus 2010


Microsoft Project2003 のオブジェクトモデル
 http://msdn.microsoft.com/ja-jp/library/cc343717.aspx

Application and Project Object Map(Office 2010)
 http://msdn.microsoft.com/en-us/library/office/ff863668%28v=office.14%29.aspx

More
[PR]
by mima_ita | 2013-11-15 22:31 | VBA
ExcelVBAでメモリの使用量を取得する
Excel2003までは以下の関数が存在します。
  • 関数名
  • 説明
  • Application.MemoryTotal
  • Excelが使用できるメモリ量
  • Application.MemoryUsed
  • Excelが使用しているメモリ量
  • Application.MemoryFree
  • Excelが使用できるメモリの空容量


Excel2007からは以上の関数は存在しません。



代替案としてどうするかというと、DLLを経由して行います。
カレントプロセスに対してGetProcessMemoryInfoを使用してPROCESS_MEMORY_COUNTERS_EXを取得します。

このPrivateUsageメンバーがコミットチャージにあたります。これは実行中のプロセスが必要としているメモリ量です。

コミットチャージを取得するDLL
http://needtec.sakura.ne.jp/vba/VBADll.zip
※このDLLは32ビットビルドです。Excelの64bitから使用したい場合は64ビットでコンパイルしてください。

DLL側のコード ※Psapi.Libをリンクする必要あり

#include <windows.h>
#include <float.h>
#include <psapi.h>
long __stdcall GetPrivateUsage()
{
PROCESS_MEMORY_COUNTERS_EX pmc;
pmc.cb = sizeof pmc;
DWORD processID = GetCurrentProcessId();
HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |
PROCESS_VM_READ,
FALSE, processID );
GetProcessMemoryInfo(hProcess, (PROCESS_MEMORY_COUNTERS*)&pmc, sizeof pmc);
CloseHandle( hProcess );
return pmc.PrivateUsage;
}



VBAからの実行例:

Declare Function GetPrivateUsage Lib "c:\hoge\VBADll.dll" () As Long
Dim a() As Long

Public Sub TestMem()
Debug.Print "前 " & GetPrivateUsage()
ReDim a(1000000) As Long
Debug.Print "確保" & GetPrivateUsage()
Erase a
Debug.Print "後 " & GetPrivateUsage()

End Sub




2013/11/27 追記
Microsoft WMI Scripting V1.2 Library を使用すれば、独自のDLLは不要です。

WMIはパフォーマンスデータやイベントログなどのシステム管理用の情報にアクセスするための管理基盤です。
http://msdn.microsoft.com/ja-jp/library/ms974579.aspx

これを用いることで、Win32APIを使用せずにシステムの情報にアクセスできます。

以下のいづれかの方法で独自のDLLを作成するのと同様にPrivate Usageにアクセスできます。

Declare Function GetCurrentProcessId Lib "kernel32" () As Long
Function GetPrivatePageCount()

Dim objSWbemServices As Object
Set objSWbemServices = GetObject("winmgmts:")
GetPrivatePageCount = objSWbemServices.Get( _
"Win32_Process.Handle='" & _
GetCurrentProcessId & "'").PrivatePageCount

Set objSWbemServices = Nothing

End Function




Declare Function GetCurrentProcessId Lib "kernel32" () As Long
' Microsoft WMI Scripting V1.2 Libraryの参照設定が必要
Function GetMemUsage2()
Dim service As SWbemServicesEx
Set service = GetObject("winmgmts:")
Dim obj As SWbemObjectEx
Set obj = service.Get("Win32_Process.Handle='" & GetCurrentProcessId & "'")
'Dim p As SWbemProperty
'For Each p In obj.Properties_
' Debug.Print p.name & ":" & p.Value
'Next p
GetMemUsage2 = obj.PrivatePageCount
Set obj = Nothing
End Function

[PR]
by mima_ita | 2013-09-28 02:20 | VBA
Excel VBAでメモリをダンプしてみる
■目的
ExcelVBAで変数のメモリをダンプしてみる。
これは非公開の関数を使用しているので、製品に組み込むような真似はすべきではない。


■コード

Option Explicit

#If VBA7 Then 'Office10 以降
Private Declare PtrSafe Sub RtlMoveMemory Lib "kernel32.dll" (ByVal Destination As Any, ByVal Source As Any, ByVal Length As LongPtr)
#Else ' Office 32-bit
Private Declare Sub RtlMoveMemory Lib "kernel32.dll" (ByVal Destination As Any, ByVal Source As Any, ByVal Length As Long)
#End If

#If VBA7 Then 'Office10 以降
Public Sub DumpMemory(ByVal offset As LongPtr, ByVal size As Long)
#Else ' Office 32-bit
Public Sub DumpMemory(ByVal offset As Long, ByVal size As Long)
#End If
ReDim data(1 To size) As Byte
Call RtlMoveMemory(VarPtr(data(1)), offset, size)
Dim i As Long
Dim j As Long
Dim hVal As String * 2
Dim add As String * 8

Dim ret As String
add = hex$(offset)
ret = add
For i = 1 To size
If j = 8 Then
j = 0
add = hex$(UnsignedAdd(offset, i))
ret = ret & vbCrLf & add
End If
hVal = hex$(data(i))
ret = ret & hVal & " "
j = j + 1
Next i
Debug.Print ret
End Sub
Private Function UnsignedAdd(ByVal Start As Long, ByVal Incr As Long) As Long
Const SignBit As Long = &H80000000
UnsignedAdd = (Start Xor SignBit) + Incr Xor SignBit
End Function


数値の変数の例:

Dim i As Long
i = 10
DumpMemory VarPtr(i), LenB(i)


出力結果

26F5D0 A 0 0 0

・・・0x000A すなわち10をあらわしている。


Stringの変数の例:

Dim s As String
s = "1あ3"
DumpMemory ByVal (StrPtr(s)), LenB(s)


59A590C 31 0 42 30 33 0

Unicodeのコード表と付き合わせると以下のようになる
http://ash.jp/code/unitbl21.htm
0x0031...UTF-16の「1」
0x3042...UTF-16の「あ」
0x0033...UTF-16の「3」


■説明
VBAでは基本的にポインタは使用できない。
だが、隠し関数として以下の3つが存在する

・VarPtr
変数のアドレスを返す

・StrPtr
UniCodeの文字列バッファのアドレスを返す
固定長の文字列を指定した場合、自動的に可変長の文字列を作成してそのアドレスを返す。
つまり、固定長の文字列に対しては使用すべきではない。

この挙動を確認するには次のコードを実行すればよい。

Dim fs As String * 5
Dim vs As String
fs = "12"
vs = "34"

Debug.Print "vs:" & hex$(StrPtr(vs)) & " fs:" & hex$(StrPtr(fs))
Debug.Print "vs:" & hex$(StrPtr(vs)) & " fs:" & hex$(StrPtr(fs))
Debug.Print "vs:" & hex$(StrPtr(vs)) & " fs:" & hex$(StrPtr(fs))

可変文字列の場合は、アドレスは変更されないが、固定文字列はStrPtrを実行するたびにそのアドレスが代わっているのが確認できる。

可変文字列と固定文字列は同じように見えるが、低レベルでメモリを操作する場合は根本的に違うということを認識しなければならない。




・ObjPtr
パラメーターとしてオブジェクト変数名を取得し、このオブジェクト変数によって参照されるインターフェイスのアドレスを取得する。


なお、配列のアドレスを取得したい場合はVarPtrArrayをせんげんして使用する

Private Declare Function VarPtrArray Lib "VBE7" Alias "VarPtr" (ByRef Var() As Any) As LongPtr

Dim a(0 To 10) As Byte
Debug.Print hex(VarPtrArray(a))

[PR]
by mima_ita | 2013-06-19 06:48 | VBA
ExcelVBAのDoxygen出力
■目的
ExcelVBAのコードをDoxygenの文章として出力します

2014/07/04 以下に引っ越しました。
http://qiita.com/mima_ita/items/635d57cc277254900c6a

■前提条件
・マクロのセキュリティで [Visual Basic プロジェクトへのアクセスを信頼する]にチェックを付与する
Doxygenをインストールしてある

■仕組み
b0232065_3103513.png


ExcelからVBScriptを使用してCLSファイルとBASファイルを出力します。
この時、マクロのセキュリティで [Visual Basic プロジェクトへのアクセスを信頼する]にチェックを付与する必要があります

次にDoxygenファイルとVBFilterを利用してDoxygenを動作させます。
この過程でBASファイルやCLSファイルはC++のコードに変換されます。
VBFilterでは関数の中までは変換していないので、本来Doxygenで作成される関数のコールグラフなどは作成できません。
このことはデッドコードの検出には使用できないということを意味します。

作成したC++を元にHTMLを作成します。

VBFilterにはいくつか種類が存在しますが、今回は下記のものを使用しました
「だらろぐ」様 vbfilter.pyを改造してみた
http://r-satsuki.air-nifty.com/blog/2008/02/vbfilter_61f1.html


b0232065_3253581.png


■使い方
1.下記のファイルをダウンロードして任意のフォルダに展開してください
http://needtec.sakura.ne.jp/vba/VbaDoxygen.zip

2.ExcelVBADoxygenを実行することでDoxygen文章を作成します
第一引数:Excelのパス
第二引数:出力フォルダ
第三引数:doxygen.exeへのフルパス

例:
ExcelVBADoxygen "C:\dev\VbaDoxygen\Sample.xlsm" "C:\dev\VbaDoxygen\output" "C:\Program Files\doxygen\bin\doxygen.exe"

■ファイルの説明
Sample.xlsm テスト出力用のエクセルファイルです
output テスト出力の結果が格納されています
python27.dll     VBFilter.exeを動かすのに必要
w9xpopen.exe   VBFilter.exeを動かすのに必要
vbfilter.exe      VBFilter.pyをpy2exeでExe化したものです。
[PR]
by mima_ita | 2013-05-16 03:26 | VBA



実験ですお
検索
カテゴリ
最新の記事
.NET4.5におけるasy..
at 2014-07-02 00:46
.NETでTwitterを検..
at 2014-06-29 00:49
Redmineのプラグインで..
at 2014-06-28 03:29
IO.popenのwrite..
at 2014-06-28 03:25
RedmineのWikiでU..
at 2014-06-28 03:16
以前の記事
最新のトラックバック
その他のジャンル
ブログパーツ