Subscribe to RSS Feed ログイン

FLASH備忘6|ActionScriptやらWordPressやらを楽しむ会

Saturday
2010年9月11日

複数条件のリストからそれぞれの行に一致するかチェックするExcel(DCOUNTA関数)

 ここでは、キーワード一覧として作ったリスト(ご飯、昼、猫)からデータベース(アンケート情報)に文字を含んでいるか検索する複数条件の一致件数をチェックする方法について説明します。

今回は、さらに検索キーワードに部分一致になるよう工夫しています。

画像:文章は例です。

screenshot.244

その他の使用例としては、

製品名リストから、アンケート情報にその文字を含んでいるかチェックするときなどに便利です。

 

■使用関数

DCOUNTAを使う

関数=DCOUNTA(①、②、③)

 

①タイトル名も含む表やデータベース

②データベースのどれか一つのタイトル名

③検索条件を作った表

 

 

実行する手順

  1. データベースを用意する。(これはアンケート情報などの検索対象です)
  2. キーワード一覧を用意する。(これは製品名などの検索ワードです)
  3. 完全一致検索ではなく、そのワードを含んでいるかチェックするためワイルドカード(*)をつける。(*を付けることによってキーワードの前後に文字が含まれても含まれていなくても一致となります。)

「 =”*”&D2&”*” 」ここではこのような関数でつなげています。

“ … 文字として認識さえるため囲う(例:”りんご”)

& … セルや文字を連結させる(例:”リンゴ”&”とまと” は リンゴとまと)

 screenshot.242

  • 今作ったキーワード一覧にタイトルを付ける。これはデータベースの検索したい列のタイトル名と一致させないと実行してくれません。

 

  • 検索対象の横のセルに
  • =DCOUNTA($A$1:$A$2,$A$1,E1:E5)
  • と入力する。

かっこ内は(検索対象の表、検索対象のタイトル名、キーワード一覧の表)となっています。

あとは一番したの行まで引き延ばすのですが、

カウント数字は、数字がおかしなことになっています。

そこで、$(ドルマーク)を使ってデータを下までオートフィルで入力する前に

固定したいセルをきめます。

オートフィルする時のセルの固定方法

(A1のセルを例に説明します。)

A1        固定なし

$A$1    行と列固定

$A1      列固定

A$1      行固定

 

セルの固定はひとつづつ説明すると説明が長くなってしまうので、ここでは飛ばします。しかし、オートフィルを便利するために必要な作業ですので、

試行錯誤しながら固定する部分を決めてみてください。

 

ここからさらに複雑になりますが、あと少しです。

このセルを固定しても数字が徐々に増加しています。

一致しない行にも数字が振られています。

そのため、次にする手順は

  • 検索している行の上のすべてのセルの合計を引きます。

つまり、一番上のセルから検索している一つ上のセルまでの合計を引きます。

これによって数が一致数が1か0になり完了です。

 

画像:DCOUNTA内の関数(最初の行)

 screenshot.242

画像:DCOUNT内の関数(最終行)

 screenshot.243

あとは、1と付いた行だけ抽出するなり、コピーするなりして活用してください。

 

 

今回はエクセル中級(?)が作成したので、

誤字脱字、手順違い等あると思います。

また、これよりもっといい方法がありましたら、ご連絡ください。

 

更新日:2009/12/23(天皇誕生日の朝より)

(実行環境,excel2007,Vista)

コメント(0)続きを読む

ボールと傾きのついた線との衝突(複数線)flash

 
角度のついた線との衝突判定。線が複数版です。

このFLASHの特徴はについて

  • 線はランダムに配置、長さもランダム
  • ボールが一定時間そこにとどまると初期位置に戻る
  • 奇跡を表示します。
  • 線と壁で跳ね返ります。
うまく動いたのですが、色々と値をいじっていると不自然なところがあります。
線10本。一見、エラーが内容に見えますが、線を増やすとエラーが目立ちます。


続いて、複数80本。線と下からの衝突に注目。


線の下方向からボールが当たると、突き抜ける現象があります。

linesBounce

最後に、ボールが大きいと、線がボールの大きさを認識してくれないバグ

 

var bounce:Number = -0.7;
var gravity:Number = 0.3;
var numLines:Number = 10;
var friction:Number = 0.99;
var ball:Ball = new Ball(10);
var count:int = 0;
var xball:Number = 0;
var yball:Number = 0;
var ballvx:Number = 100;
var ballvy:Number = 100;

addChild(ball);
ball.x = stage.stageWidth/2;
ball.y = 10;

//配列に線の作成と格納
var lines:Array = new Array();
for (var i:int=0; i<numLines; i++) {
 var line:Sprite = new Sprite();
 line.graphics.lineStyle(3,Math.random()*0xffffff);
 line.graphics.moveTo(0, 0);
 line.graphics.lineTo(140*Math.random()+80, 0);
 addChild(line);
 lines.push(line);
}

//線の配置処理
for (i = 0; i<numLines; i++) {
 lines[i].x = Math.random()*470;
 lines[i].y = Math.random()*350+50;
 lines[i].rotation = Math.random()*120-60;
}

//フレーム毎のイベントの追加
addEventListener(Event.ENTER_FRAME, onEnterFrame);
function onEnterFrame(e:Event):void {

 ball.vy += gravity;

 ball.vx *= friction;
 ball.vy *= friction;

 ball.x += ball.vx;
 ball.y += ball.vy;

 var right:Number = stage.stageWidth;
 var bottom:Number = stage.stageHeight;
 var r:Number = ball.radius;

 //壁との跳ね返り処理
 if (ball.x < r) {
  ball.x = r;
  ball.vx *= bounce;
 } else if (right - r < ball.x) {
  ball.x = right - r ;
  ball.vx *= bounce;
 }
 if (ball.y < r) {
  ball.y = r;
  ball.vy *= bounce;
 } else if (bottom - r < ball.y) {
  ball.y = bottom - r;
  ball.vy *= bounce;
 }
 //奇跡の表示
 graphics.beginFill(0x00cc00);
 graphics.drawCircle(ball.x, ball.y ,1);

 //線との衝突チェックの開始
 for (var i:int = 0; i<numLines; i++) {
  checkLine(lines[i]);
 }
 
// //画面上に速度を表示する。
// t1_txt.text = String(Math.round(ball.vx*100)/100);
// t2_txt.text = String(Math.round(ball.vy*100)/100);
 //t1.text = String("aaa");
 
 //フレームをカウントして一定時間移動がなければ、初期値にもどす
 count++;
 if (count>60) {
  count = 0;
  ballvx = ball.x - xball;
  ballvy = ball.y - yball;
  if (Math.abs(ballvx) < 5 && Math.abs(ballvy) < 5) {
   ball.x = stage.stageWidth*Math.random();
   ball.y = 10;
   ball.vx = 0;
   ball.vy = 0;
  }
  xball = ball.x;
  yball = ball.y;
 }
}

//チェック処理
function checkLine(line:Sprite):void {

 //線の大きさの取得
 var bounds:Rectangle = line.getBounds(this);
 if (ball.x > bounds.left && ball.x < bounds.right) {

  var angle:Number = line.rotation * Math.PI/180;
  var cos:Number = Math.cos(angle);
  var sin:Number = Math.sin(angle);

  var x1:Number = ball.x - line.x;
  var y1:Number = ball.y - line.y;

  var y2:Number = cos * y1 - sin * x1;
  var vy1:Number = cos * ball.vy - sin * ball.vx;

  //衝突時の処理
  if (y2 > -ball.height/2 && y2 < vy1) {

   var x2:Number = cos * x1 + sin * y1;

   var vx1:Number = cos * ball.vx + sin * ball.vy;
   y2 = -ball.height/2;
   vy1 *= bounce;

   x1 = cos * x2 - sin * y2;
   y1 = cos * y2 + sin * x2;
   ball.vx = cos * vx1 - sin * vy1;
   ball.vy = cos * vy1 + sin * vx1;
   ball.x = line.x + x1;
   ball.y = line.y + y1;
  }
 }
}

 

アップしてから気付いたのですが、fps(フレーム毎秒)が120のままでした(汗)

コメント(0)続きを読む

Flash ボールの衝突判定複数版

ボールの衝突判定複数版

もっと硬いボールをイメージして作ったのですが、ボールがやわらくめりこんでしまいます。

 

//定数は最初にまとめて定義
var numBalls:int = 20;
var bounce:Number = -0.01;
var spring:Number = 0.6;
var gravity:Number = 0.9;

//配列で個別にボールの初期位置を定義
var balls:Array = new Array();
for (var i:int = 0; i<numBalls; i++) {
 var ball:Ball = new Ball(Math.random()*40+25, Math.random() * 0x000000);
 ball.x = Math.random() * stage.stageWidth;
 ball.y = Math.random() * stage.stageHeight;
 ball.vx = Math.random() * 6-3;
 ball.vy = Math.random() * 6-3;
 addChild(ball);
 balls.push(ball);
}
addEventListener(Event.ENTER_FRAME, onEnterFrame);

function onEnterFrame(e:Event):void {
 //配列で個別に計算
 for(var i:int = 0; i< numBalls - 1; i++){
  var ball0:Ball = balls[i];
  for(var j:int = i + 1; j< numBalls; j++){
   var ball1:Ball = balls[j];
   var dx:Number = ball1.x - ball0.x;
   var dy:Number = ball1.y - ball0.y;
   var dist:Number = Math.sqrt(dy*dy + dx*dx);
   var minDist:Number = ball0.radius + ball1.radius;

 //真中のボールと衝突したときの跳ね返り
   if (dist<minDist) {
    var angle:Number = Math.atan2(dy, dx);
    var tx:Number = ball0.x + Math.cos(angle) * minDist;
    var ty:Number = ball0.y + Math.sin(angle) * minDist;
    var ax:Number = (tx - ball1.x) * spring;
    var ay:Number = (ty - ball1.y) * spring;
    ball0.vx -= ax;
    ball0.vy -= ay;
    ball1.vx += ax;
    ball1.vy += ay;

   }
  }
 }
 for(i = 0; i<numBalls; i++){
  var ball:Ball = balls[i];
  move(ball);
 }
}

//ボールの運動は切り離して計算
function move(ball:Ball):void {
 ball.vy += gravity;
 ball.x += ball.vx;
 ball.y += ball.vy;
 
 //ステージ端の跳ね返り
 if (ball.x < ball.radius) {
  ball.x = ball.radius;
  ball.vx *= bounce;
 } else if (ball.x > stage.stageWidth - ball.radius) {
  ball.x = stage.stageWidth - ball.radius;
  ball.vx *= bounce;
 }
 if (ball.y < ball.radius) {
  ball.y = ball.radius;
  ball.vy *= bounce;
 } else if (ball.y > stage.stageHeight - ball.radius) {
  ball.y = stage.stageHeight - ball.radius;
  ball.vy *= bounce;
 }
}

コメント(0)続きを読む

複数のバネの運動 - AS3.0

複数目標のバネの運動です。周りの青いボールに真中の緑のボールがゴムで固定されているように見えます。周りの青いボールだけマウスでドラック&ドロップで動かすことができます。

 

色々実験してみてわかった結果

摩擦係数に関してfriction

  • 1に近い値(0.9だと)ツルツルな動き
  • 0に近い値(0.1だと)べったりとして動き
  • 1を超えるとバネで振れながら大きくなる
  • マイナスになると膨張

スプリングに関してspring

  • 1に近い値(0.9だと)高速に振れるブルブル
  • 0に近い値(0.1だと)のっそりと収束
  • 1を超えるとガチガチ1.6以上は膨張
  • マイナスになると膨張

//ハンドル付きボールのハネ運動スクリプト
var spring:Number = 0.1;
var friction:Number = 0.8;
var numHandles:Number = 3;
//センターボールの作成
var ball:Ball = new Ball(40, 0x006600);
addChild(ball);

//ハンドルの配列制御
var handles = new Array();
for(var i:int=0; i<numHandles; i++){
 var handle:Ball = new Ball(10, 0x0000ff);
 handle.x = Math.random() * stage.stageWidth;
 handle.y = Math.random() * stage.stageHeight;
 addChild(handle);
 handle.addEventListener(MouseEvent.MOUSE_DOWN, onPress);
 handles.push(handle);
}
addEventListener(Event.ENTER_FRAME, onEnterFrame);
addEventListener(MouseEvent.MOUSE_UP, onRelease);

//フレーム毎の処理
function onEnterFrame(e:Event):void {
 //ボールの生成部分
 for(var i:int = 0; i<numHandles; i++){
  var handle:Ball = handles[i] as Ball;
  
  //ボールの動き
  ball.vx += (handle.x - ball.x) * spring;
  ball.vy += (handle.y - ball.y) * spring;
 }
 ball.vx *= friction;
 ball.vy *= friction;
 ball.x += ball.vx;
 ball.y += ball.vy;
 
 //線の生成
 graphics.clear();
 graphics.lineStyle(1);
 for(i = 0; i<numHandles; i++){
  graphics.moveTo(ball.x, ball.y);
  graphics.lineTo(handles[i].x, handles[i].y);
 }
}

//マウスを押したとき
function onPress(e:MouseEvent):void {
 e.target.startDrag();
}

//マウスを離したとき
function onRelease(e:MouseEvent):void {
 stopDrag();
}

コメント(0)続きを読む

AS3.0バネチェーン複数版FLASH

ばねチェーン複数版FLASH

まずは、ボールが5個のとき、バネを調節した動き

続いて、ボールが20個のとき、スプリング係数と摩擦係数を調節

ボール100個のとき、スプリング係数と摩擦係数を調節。

 

ボール5個のときのスクリプト


//変数定義
var targetX:Number = stage.stageWidth/2;
var targetY:Number = stage.stageHeight/2;
var spring:Number = 0.2;
var friction:Number = 0.6;
var gravity:Number = 1;
var balls:Array = new Array();
var numBalls:int = 5;
//ボールの数だけ作成して、表示。配列にプッシュする。
for (var i:int = 0; i<numBalls; i++){
 var ball:Ball = new Ball(20, 0x0000ff*i/numBalls);
 addChild(ball);
 balls.push(ball);
}
addEventListener(Event.ENTER_FRAME, onEnterFrame);
//フレーム毎のイベント
function onEnterFrame(e:Event):void {
 graphics.clear();
 graphics.lineStyle(1,0xaaaaaa);
 graphics.moveTo(mouseX, mouseY);
 moveBall(balls[0], mouseX, mouseY);
 graphics.lineTo,(balls[0].x, balls[0].y);
 //ボール数を指定した分だけ繰り返す
 for(var i:int = 1; i<numBalls; i++){
  var ballA:Ball = balls[i-1];
  var ballB:Ball = balls[i];
  moveBall(ballB,ballA.x, ballA.y);
  graphics.lineTo(ballB.x, ballB.y);
 }
}
//複数のボールを別々に計算するための配列
function moveBall(ball:Ball, targetX:Number, targetY:Number):void {
var dx:Number = targetX - ball.x;
var dy:Number = targetY - ball.y;
//バネ運動は加速の値に掛けます。
var ax:Number = dx * spring;
var ay:Number = dy * spring;
ball.vx += ax;
ball.vy += ay;
ball.vx *= friction;
ball.vy *= friction;
//ball.vy += gravity;
ball.x += ball.vx;
ball.y += ball.vy;
}

ねむすぎて、意識がもうろうとしてる中で作成しました。

コメント(0)続きを読む