これまでは、Excel-DNA を使って シート上で利用できる「関数」を作ってきました。今回は、「コマンド」を作ります。
関数のように式を入力したセルに値を返すのではなく、Excel-DNA から Excel のセルのデータを操作する方法について理解できると思います。
前回 は、TwitterAPI を使ってユーザー情報を取得しましたが、今回は
「指定したユーザーの指定した数の tweet を取得して複数のセルに表示」します。
セルA1 に呟きを取得したいユーザーID(@は不要)、セルA2 に取得したい呟きの数を入力し、コマンドを実行します。
(こんな感じ↓)

すると、結果は・・・
(こんな感じ↓)

上の例では、@Kantei_Saigai の呟きを 1000件 取得しています。
DLL を作成するほどでもないので、.dna ファイルに直接記述してみます。
(こんな感じ↓)
<DnaLibrary RuntimeVersion="v4.0" Language="CS">
<Reference Path="DynamicJson.dll"/> // JSON 解析にDynamicJson.dllを利用
<Reference Path="Microsoft.CSharp.dll"/> // Dyanamic 型を利用する
<![CDATA[
using System;
using Codeplex.Data; // DynamicJson の名前空間
using System.Net; // WebClient を利用
using ExcelDna.Integration; // 関数・コマンド属性を利用
public static class GetUserTweet
{
[ExcelCommand(MenuName = "UserTweet取得", MenuText = "A1の呟きをA2の数だけ取得してB列に表示")]
public static void UserTweet()
{
ExcelReference ref_user = new ExcelReference(0, 0); // A1からユーザ名取得
ExcelReference ref_num = new ExcelReference(1, 0); // A2から取得数取得
int num = int.Parse(ref_num.GetValue().ToString());
string[] tweets = Data.Get(ref_user.GetValue().ToString(), num);
for (int i = 0; i < num; i++)
{
ExcelReference c = new ExcelReference(i, 1); // B列に表示
c.SetValue(tweets[i]);
}
}
}
public static class Data
{
[ExcelFunctionAttribute(IsHidden = true)]
public static string[] Get(string user, int num)
{
if (user == "" || num == 0)
{
return null;
}
string[] tweets = new string[num];
try
{
// TwitterAPI アクセス
dynamic sol = new WebClient().DownloadString(
@"https://api.twitter.com/1/statuses/user_timeline/" + user + ".json?count=" + num.ToString());
dynamic status = DynamicJson.Parse(sol);
int n = 0; // 指定した数の呟きを配列に入れる
foreach (dynamic item in status)
{
if (item.text != null)
{
tweets[n] = item.text;
n++;
}
if (num <= n)
{
break;
}
}
return tweets; // 呟きの配列を返す
}
catch (Exception)
{
return null;
}
}
}
]]>
</DnaLibrary>
あっけないですが・・・終わりです(笑)
いつものように、上記のコードをテキストファイルに貼り付けてファイル名を GetTweet.dna に変更し、ExcelDna.xll を GetTweet.xll に名前変更します。今回は DynamicJson.dll を使っていますので、前述の2つのファイルと同じフォルダに置きます。あとは、Excel のシートに GetTweet.xll をドラグ&ドロップするだけですね♪
では、また(笑)
ダウンロードはこちら ⇒ GetTweet.zip

ああ、知恵袋のかw
こんばんは^^
>ああ、知恵袋のかw
なんと・・・
ベストアンサーです!(キリッ
内容を理解して頂けたかどうかは・・・疑問ですけど^^
とりあえず、役には立ったみたいです(笑)
エクセル2003ではできないでしょうか?やってみましたが知識不足おせいもあると思いますがちょっとよくわからなかったです。
うえのさん
いらっしゃいませ。ご来店ありがとうございます(笑)
>エクセル2003ではできないでしょうか?
Excel2003 でも動作します。ただし、.NetFramework4.0 が必要です。ご利用の環境に、.NetFramework4.0 がインストールされていないと動作しませんので、こちら からダウンロードしてインストールしてみてください。
>やってみましたが・・・
ダウンロードした圧縮ファイルを解凍して、その中の「GetTweet.xll」を、開いているExcel のシート上にドラッグ&ドロップすると、アドインが出来るはずなんですが・・・
Excel2003 が手元にないので、ボタンが何処に出来るか判りませんけど、ボタンはできてますか?
Twitter の反応が鈍い場合(混みあっているとき)は、呟きの取得に時間がかかるため、無応答(応答がありません)になるかもしれませんが、取得されるまで待っていると表示されると思います。
お試しください。
このページに書かれている通りにやったのですが、ボタンがでてきません(泣)
(ダウンロードして、xllをドラッグアンドドロップ)
excel2013で、NETFrameworkもインストールしたのですが、本当の素人なので申し訳ありませんが
ご教授願えませんでしょうか。よろしくお願いいたします。
kamekiti さん、はじめまして。
ボタンは、「アドイン」タブに生成されるはずです。
こんな感じ↓
http://supermab.com/wp/wp-content/uploads/2013/05/gapi00.jpg
ありませんか?
お返事ありがとうございます!無事できました!
最新から200ツイートまでしか取得できなかったのですが、第何番目から取得する、という指定はできませんでしょうか?たびたびすみません
twitter api 1.0 は廃止され、6月11日をもって 1.1 に移行するようです↓
https://dev.twitter.com/blog/api-v1-retirement-date-extended-to-june-11
http://www.atmarkit.co.jp/ait/articles/1304/01/news111.html
このコードは twitter api 1.0 を利用しているので、6/11 以降は動作しなくなります^^
仕様変更によるコードのメンテは、WebAPI を利用する上での宿命ですね。