2017年2月
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28        

Amazonウィジェット

  • miniPC
  • 最近買った本
  • Raspberry Pi
  • クアッドコプター
  • 書籍ランキング

AdSense

  • 広告
無料ブログはココログ

エクセル

2014年3月12日 (水)

エクセル リストの区切りを見つけて印をつける

同じデータが断続的に並んでいる場合、同じデータ同士でグループ化して計算をすることがよくある。毎回マクロを使ってしまうと時間がかかってしまうので、セルに数式を書き込むやり方をさわりのところまで考えた。

データがE列に入っていて、その隣のF列に、
=IF(E6<>E5,"diff","")

こんなやつを書き込めば、データが前の行と異なっていたら”diff”という値がセットされる。
だから実行すると、こんな風になる。
Ws000016

さらに区切りがある行を表示させたいときは、"row()"を使う。
=IF(E6<>E5,row(),"")

これを使って、データの区切りごとに合計を求めたり最大値の入っているセルを拾ったりできるかもしれない。

セル選択の情報が書かれたセルをindirect()関数に渡せば、この関数で選択された情報がそのまま別の関数に渡せる。

たとえば、合計を求めるときはこのようにセルの番地を指定する。
"=sum(D3:D13)"

これをD3:D13という文字をD19セルに入れておき、
"=sum(indirect(D19))"

とすると、同じ結果が得られる。
sumに直接セル番地を指定すると、いちいち手打ちで修正が必要になる。
一方、indirectを間に挟んでいると、D19にセル選択範囲を示す文字列が入ってさえいれば自動的にsumの結果が更新される。

rowやindirectを組み合わせると、マクロが組めなくてもそれなりの処理ができるかも。

2013年6月26日 (水)

マクロからファイル(WorkBook)を開く方法

エクセルVBAを使って、ファイルを開く方法。
大量のファイルを自動的に開けるようになるので、作業の自動化には不可欠な技。

もっとも頭を悩ますのはファイルパスの指定方法。
絶対パスでチマチマ指定していたら、ファイル位置が変更になったとき書き直しが必要になる。第一再利用性も悪い。

そこで、カレントディレクトリを使った指定方法、というか書式がある。
今、↓のようなマクロを実行しているファイルと同じディレクトリに、tameshiExcel.xlsというファイルがあり、これを開きたいとする。

Workbooks.Open ActiveWorkbook.Path & "\tameshiExcel.xls"

ActiveWorkbook.Pathというのが、カレントディレクトリの文字列に展開される。これを&で文字列結合して、””の中で、同じディレクトリにあるファイルを指定する。

&の前に、ChDirを使ってもいい。いくつかやり方はある様子。

MsgBox ChDir

とすれば、簡単に動作が確認できる。
ファイルを開くなど、動作の対象になるファイルがなかった場合エラーで止まってしまうので、MsgBoxで正しく指定できているかを表示させるのがやりやすい。




-------------------------------------------------------

Webとエクセルを連携する方法もあるようです。
エクセルにネットから拾ってきた株価を貼り付ける。
なんていうサンプルソースがWeb上に載っていたことがあったような。

Excel VBAでIEを思いのままに操作できるプログラミング術 Excel 2013/2010/2007/2003対応

        近田 伸矢,植木 悠二,上田 寛 インプレスジャパン 2013-04-19
        売り上げランキング : 5636
by ヨメレバ

2013年6月21日 (金)

できると便利。マクロでグラフを描く方法。

エクセルマクロを使って、グラフを作成する方法。
大量に同じ書式のグラフを作りたいときに使える技。

全自動化まではしなくても、手で一回ずつ値を選択して作成するより、VisualBasicエディターに書いたマクロのパラメータを書き換えて作るほうがまだマシ。

こんなソースです。

Sub Sample()
    With ActiveSheet.ChartObjects.Add(30, 50, 800, 200).Chart
        'グラフの種類指定
        .ChartType = xlLineMarkers

        'データの範囲
        .SetSourceData Source:=Range("AJ2370:AJ2665")

        'グラフのタイトル
        .HasTitle = True
        .ChartTitle.Characters.Text = "Process data"

        'X軸のタイトル
        .Axes(xlCategory, xlPrimary).HasTitle = True
        .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "P number"

        'Y軸のタイトル
        .Axes(xlValue, xlPrimary).HasTitle = True
        .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "Voltage"
    End With
End Sub


このデータの範囲指定を固定値ではなく、引数としてRangeオブジェクトを渡してやれば、同じ書式でデータの異なる大量のグラフを作成することが可能となる。グラフの描画位置の指定など、他にもパラメータがあるので用途に応じ検索されたし。



-------------------------------------------------------

そういえば昔、Robo-Oneなどでやっている2足歩行ロボットを作るために
関節の動きをシミュレーションするグラフを、エクセルでちまちま作っていました。

この本は、さらにレベルが高く、インフルエンザの流行予測や森林火災シミュレーションもできるようです。
↓このリンクから中身がちょっとだけ見られます。


新 Excelコンピュータシミュレーション -数学モデルを作って楽しく学ぼう-

        三井 和男 森北出版 2010-03-12
        売り上げランキング : 102220
by ヨメレバ

2013年6月18日 (火)

ワークシート関数の使い方 動作がおかしい??

エクセルVBAのワークシート関数を使おうとしたら、へんなところで嵌ってしまったのでメモ。
ワークシート関数とは、普段セルに入力してる、SUMやMINなどの標準で出てくるエクセル関数のこと。

これらをVBAの中でも使うことができるのだが、関数に渡す型を間違うと正常に動作しない。しかし、何らかの値は返してくるので正常に動いていると勘違いしやすく、困ったものだ。

たとえばあるセル範囲を指定してMIN関数に渡したとする。

area = Range(Cells(startRow, startCol), Cells(endRow, endCol)).Value
min = Application.WorksheetFunction.Min(area)

上のようにやると、指定したセル範囲の中で明らかにMIN値ではない値が返されたり、返されなかったりする。

実は、Rangeの最後につけてしまった.Valueが原因。
Min関数の引数は、Rangeそのものなので、値そのものを入れてしまうと引数の型が一致しなくなる。すると動作は保証されない。

正解はこちら。

Set area = Range(Cells(startRow, startCol), Cells(endRow, endCol))
minv = Application.WorksheetFunction.Min(area)

最後のValueを消す。そして正しくは、Rangeオブジェクトをareaというオブジェクト変数に入れるので、Setステートメントが必要。

setステートメントについては、こちらの解説に詳しい。



--------------------------------------------------------

エクセルがあれば何でもできる。かも、

Excel VBAゲーム大作戦〈1〉はじめてのゲームプログラミング

        C&R研究所 エクスメディア 2005-08
        売り上げランキング : 387959
by ヨメレバ

2013年6月12日 (水)

よく使う領域選択 Range, Cells, CurrentRegionの使い方

エクセルマクロVBAを使って、シートの中のセルを選択するテクニックについて、いくつかのやり方、パターンを解説。

いちいち開始セルの行と列を指定して、、とやらなくても、
データが入力されているセルを一塊で選択する方法がある。

Ws000046

たとえば上のようにデータが入っているとする。
そこに、こんなマクロを実行してみる。

Range("F7").CurrentRegion.Select

これを使うと、
F7セルを中心に、隣接して固まっているセルを自動的に選択できる。

ところで、
自動的に選択された領域の、左上端と右下端のセルも簡単に取得できて、

startRow = Range("F7").CurrentRegion.Row
startCol = Range("F7").CurrentRegion.Column
endRow = Range("F7").CurrentRegion.SpecialCells(xlCellTypeLastCell, xlNumbers).Row
endCol = Range("F7").CurrentRegion.SpecialCells(xlCellTypeLastCell, xlNumbers).Column


このように、SpecialCells(xxx, xlNumbers)をつけて、xxxのところにxlCellTypeLastCellを入れれば、領域の最後のセルが選択される。さらに最後にRowをつければ、その領域最後のセルの行が取り出せる。

さらに、タイトル行や見出しの、データと関係のないところを省きたければ、

startRow = Range("F7").CurrentRegion.Row + 1 '1=データ開始行オフセット
startCol = Range("F7").CurrentRegion.Column + 1 '1=データ開始列オフセット
endRow = Range("F7").CurrentRegion.SpecialCells(xlCellTypeLastCell, xlNumbers).Row     endCol = Range("F7").CurrentRegion.SpecialCells(xlCellTypeLastCell, xlNumbers).Column

このようにタイトル行に対してオフセットを入れればOK。

--------------------------------------------------

ちょっと昔、エクセルのマクロでテトリスを作ったことがあるのです。

ExcelVBAでできる RPGゲーム作成入門

        結城 圭介 技術評論社 2011-11-08
        売り上げランキング : 70798
by ヨメレバ

2013年3月31日 (日)

エクセルのマクロ 決まったパターンで行を挿入する。

マイコンに読ませるデータを作成するときにエクセルのマクロをよく使うので、一応メモしてまとめ。(Microsoft Excell 2003)

セルを選択しているカーソルの移動をしたいときは、
ActiveCell.Offset(3, 5).Select
を使う。引数3、5がそれぞれ移動する行数、列数を示している。

行を3個挿入して現在のセルから4行下に移動する。
これを200回繰り返す。

Sub gyouPush()
    For i = 1 To 200
        Selection.EntireRow.Insert
        Selection.EntireRow.Insert
        Selection.EntireRow.Insert
        ActiveCell.Offset(4, 0).Select
    Next i
End Sub

行を挿入のほかに、セルの色を変えるとか、太字に変えるとか処理内容を変えることで色々使える。