Posts on this page


April 28, 2014

Excelのワークシートで入力したセル自体を指定する

エクセルを使っているときに、式を入力したセル自体を選択するには、通常はセルの番地を入力すれば、それで足ります。

ところが、条件付き書式を使う場合など、複数のセルに対して、入力されているセル自体を指定するようなワークシート関数はないようです。
そこで、以下のような指定方法を使うと、Thiscellに当たるようなセル指定が出来ます。

OFFSET($A$1, ROW() - 1, COLUMN() - 1)
INDIRECT(ADDRESS(ROW(), COLUMN()))

条件付き書式での活用例を示します。
通常、条件付き書式は、そのセルの値の正負や大小で書式を設定するものですが、
以下の例では隣のセルの値が正の時にセルの書式を設定することが出来るようになります。
= OFFSET(INDIRECT(ADDRESS(ROW(), COLUMN()), , 1) >0

April 18, 2014

Excel VBA にはThisworksheetがない?でもActiveSheetとMeがある!

ThisWorkbook、ActiveWorkbook、ActiveSheetはあるのですが、ThisWorksheetはありません。
実際には、標準モジュールでコーディングする場合は、Activesheetで必要な処理ができてしまいます。
以下のコードを実行すると、ActiveSheetの中身を確認できます。
どうしてもThisWorksheetと書きたい場合や、他のシートをアクティブにするVBAの場合はSetステートメントでThisWorksheetにActiveSheetを保存しておきます。

次のサンプルでは、別のシートをアクティブにした場合の結果を示します。
Sub testActiveSheet
   Set ThisWorksheet = ActiveSheet
   Msgbox "ActiveSheet is " & ActiveSheet.Name
   Msgbox "ThisWorksheet is " & ThisWorksheet.Name

   ActiveSheet.Next.Activate

   Msgbox "ActiveSheet is " & ActiveSheet.Name
   Msgbox "ThisWorksheet is " & ThisWorksheet.Name
End Sub
シートにコードを書く場合は、Meキーワードを使うこともできます。Meキーワードはコードが実行されているモジュールそのものを示しているので、以下のコードをSheet2から呼び出した場合でもMe.NameはSheet1のままです(コードがSheet1に書いてあるとすれば)。

 なお、Meキーワードはクラスモジュールでしか使えないので、標準モジュールで使うとエラーとなります。
Sub testMe
   Set ThisWorksheet = ActiveSheet
   Msgbox "ActiveSheet is " & ActiveSheet.Name
   Msgbox "ThisWorksheet is " & ThisWorksheet.Name

   Msgbox "Me is " & Me.Name

   ActiveSheet.Next.Activate

   Msgbox "ActiveSheet is " & ActiveSheet.Name
   Msgbox "ThisWorksheet is " & ThisWorksheet.Name

   Msgbox "Me is " & Me.Name
End Sub 

選んだcsvファイルをエクセルに取り込むマクロ

VBAを使って、選んだcsvファイルをエクセルに取り込んでくれるマクロです。

April 13, 2014

Excel TopLeftCell プロパティをSelection.ShapeRangeに対して適用するには

以下の記事で示したように、Selectionに対して、TopLeftCellを求められませんでした。
found, known and done.: Excel VBAのTopLeftCellプロパティが分からない
http://foundknownanddone.blogspot.jp/2014/04/excel-vba-topleftcell-runtime-error-selection-does-not-support-this-property.html
もう少し調べて理解した範囲でなぜなのか、どうすればよいのかを以下に解説します。

April 12, 2014

Excelで画像ファイルを切り抜き、並べるマクロ

Excelのセルを表のセルとして利用し、そこに適当なマージンを設定した大きさになるように画像をトリミングするツールを作成しました。

使用方法

  1. 切り抜きたい画像を選びます。
  2. setCropBoxWithMarginで切り抜き範囲を指定する枠を生成します。
  3. 画像の上で切り抜き範囲を動かして切り抜きたい範囲を指定します。
  4. cropPictureToBoxでで図形を切り抜きます。
  5. 前項で画像を自動配置しなかった場合は、画像をおおよそセルの中央に移動させた後、以下のマクロを使って場所を調整します。
found, known and done.: Excelの図の位置をセルの中心に
http://foundknownanddone.blogspot.jp/2014/04/excel-centering-object-to-cell.html#more

April 10, 2014

Excel VBAのTopLeftCellプロパティが分からない

Excel VBAには、オブジェクトの左上にあるセルを求めてくれるTopLeftCellというプロパティがあるのですが、いまいち使い方が分からないのでメモ。

Selectionに対して機能しない

選んだ図形のそれぞれのTopLeftCellを得ようとして、以下のようなコードを書くと、「実行時エラー '438' オブジェクトはこのプロパティまたはメソッドをサポートしていません。」というエラーが発生します。

Sub testTopLeftCell()
    For Each target In Selection.ShapeRange
        MsgBox target.TopLeftCell.Address
    Next
End Sub

以下の記事にもあるように昔から知られている問題のようですが、あまりこの機能を使う人がいないのか、それとも、もっと簡単な解決法があるからなのか、ネット上を検索してもまともな解答が見つかりません。
VB Macro problem using TopLeftCell
http://www.mrexcel.com/forum/excel-questions/432495-vbulletin-macro-problem-using-topleftcell.html#

対処療法しかないのか?

まともな対応方法が分からず、今のところ以下のようなコードでお茶を濁しています。
どうやるのが正解なのでしょう…。

Sub testTopLeftCell2()
    For Each target In Selection.ShapeRange
        MsgBox ActiveSheet.Shapes(target.Name).TopLeftCell.Address
    Next
End Sub

2014/4/12追記 .Nameは一意でないので.IDを使う方がよさそう…か?
Sub testTopLeftCell3()
    For Each target In Selection.ShapeRange
        MsgBox ActiveSheet.Shapes(target.id).TopLeftCell.Address
    Next
End Sub

April 8, 2014

google spreadsheetからtableタグを抜き出す

google spreadsheetは、ブラウザだけで表計算が可能で便利ですが、他のページに埋め込む場合、標準ではテーブルのみをコンパクトに埋め込むことができないようです。そこで、jqueryを使って簡単に埋め込む方法をメモします。

コード中のKEY_OF_YOUR_SPREADSHEETにはスプレッドシートを公開するときに得られるキーを使います。また、結果を入れたいdivタグのidをコード中で指定しておきます(サンプルコードではspreadsheetresultとしています。)

<div class="spreadsheetresult">Loading google spreadsheet...</div>
<script src="//code.jquery.com/jquery-1.11.0.min.js"></script>
<script>
$(function(){
   $.get("https://docs.google.com/spreadsheet/pub?key=KEY_OF_YOUR_SPREADSHEET",function(data){
      var output=$(data).find("#tblMain")
      $(output).find(".hd").remove()
      $(output).find(".rShim").remove()

      $(".spreadsheetresult").contents().replaceWith(output)
   })
})
</script>

実行結果

Loading google spreadsheet...


もっと高度なことをしたいときは…

JSONもサポートしているのでスクリプトをきちっと組んでやってもいいのですがjqueryを使ってやれば、XHRとDOM操作のわずかなコードでtableタグを抜き出すことが出来ます。
抜き出したタグはstyleを使って味付けすればお好みの表になりますね。

Simple example of retrieving JSON feeds from Spreadsheets Data API - Google Data APIs — Google Developers
https://developers.google.com/gdata/samples/spreadsheet_sample?hl=ja

April 6, 2014

SyntaxHighlighterでHTMLコードをブログに掲載するときの文字変換ブックマークレット

Syntax Highlighterはとても便利なコード装飾用のソフトですが、HTMLコードをpreタグを使って表示する場合、<と>をエスケープして&lt;と&gtにしなければなりません。

検索・置換を毎回やっていても不便なのでブックマークレットにしました。

他サイトの記事を簡単に引用するブックマークレット

他のサイトを表示した状態で、実行すると、選択部分のテキスト、記事のタイトル、リンクを表示するブックマークレットです。
適当に編集して使ってください。

javascript - Return HTML from a user-selected text - Stack Overflow
http://stackoverflow.com/questions/4652734/return-html-from-a-user-selected-text/4652824#4652824

使い方

サイトを開いた状態で、引用したい部分を選択します(しなくてもよい)。
ブックマークレットを実行すると、コードが表示されるので、それをコピーしてお好みのHTMLエディタに貼り付けます。
なお、テキストを選択していなかった場合は、ページタイトルとリンクだけのコードになります。

Excel VBAの再利用性を高めるために

Excel VBAのコードはWeb上のあちこちに紹介されていますが、実際にコピーしてきて手元で使おうとすると、エラーが出ることがよくあります。その原因の一つは、コードが特定の形をしたデータにのみ使えるような形で書いてあり、マジックナンバーが多数指定されていることです。
 再利用性が高いコードを書こうとすると、マジックナンバーを使わない、という考え方を、セル範囲やオブジェクトの指定にも使っていくことが望ましいでしょう。

ここでは、Webでよく見かけるコードの例を挙げて、本来の目的・意図に応じた書くべきコードを示します。

よく見かけるコードの例 本来の目的・意図 書くべきコード
Worksheets("Sheet1") "Sheet1"という名前のシート そのまま
ブックの中の1番目のシート Worksheeets(1)
アクティブなシート Activesheet
Range("A2,F5") $A$2:$F$5 そのまま
選択したセル範囲 Selection
Sheets(i) シートを処理したい(ワークシートもグラフシートも) そのまま
ワークシートを処理したい Worksheets(i)
グラフを処理したい Charts(i)
(埋め込みグラフを処理したい ChartObjects(i))

 なお、マジックナンバーを使わず入力に対して柔軟な書き方をする場合、エラーが生じやすくなるので入力値を確認してエラーを防ぐことが必要です。
例えば、入力の型をTypename関数で調べて必要な型の時だけ入力を受け入れたり、0除算を防ぐために入力値が0以上であることを確認するなどの方法が考えられます。

Excelで選択範囲のデータを間引く

Excelでデータを間引くマクロは色々なサイトで紹介されていますが、ここでは、選択したセル範囲内だけを処理するマクロを紹介します。
 
なお、選択範囲を事前に調整するために以下のサブルーチンを使用しますので、使用される場合は以下のコードも合わせて使ってください。
found, known and done.: Excelの選択範囲をデータのある範囲に縮小する
http://foundknownanddone.blogspot.jp/2014/04/excel-shrink-selection.html#more

Excelの選択範囲をデータのある範囲に縮小する

SHIFT+CTRL+↓でもいいのですが

エクセルでデータを処理する場合に、セル範囲を厳密に選ぶのは結構面倒です。例えば、2000行のデータがあったとして、間に空白セルも含まれている、というような場合、SHIFT+CTRL+→キーだと繰り返し操作が必要にります。
また、各種マクロの前処理として選択範囲をデータのある範囲に狭めたい場合があります。

そこで、選択範囲をデータのある範囲に縮小するマクロを作成しました。

April 5, 2014

Bloggerのテンプレートの構造と編集方法(2)-テンプレートの全体像-

Bloggerテンプレートの理解を進める第2弾です。
まだテンプレートの中身の話にはなっていません。テンプレート全体のコードがどうなっているか、それが何に対応しているのか、を示します。
  1. Bloggerのテンプレートの構造と編集方法(1)-ブログシステム全体像-
  2. Bloggerのテンプレートの構造と編集方法(2)-テンプレートの全体像-(この記事)
  3. Bloggerのテンプレートの構造と編集方法(3)-実際の記述-

テンプレートの全体像

テンプレート自体は、一つのxml文書で、以下のような構造をしています。 ネスティングしたタグによってページの各部分のパーツが表現される仕組みです。

それぞれの部品の中にブログシステムが実際のコンテンツを埋め込んでくれます。

テンプレートの実際のコードはhtmlで記載されている部分と、googleが定義した独自タグであるb:から始まるタグで記載されている部分が混在した形になっています。
それについては次の記事に記載します。
<?xml version="1.0" encoding="UTF-8" ?>
<html>
<head>
<b:skin>...</b:skin>
</head>
<body>
 
  <b:section id='header'>
    <b:widget id='header'></b:widget>
  </b:section>
 
  <b:section id='main'>...</b:section>
 
  <b:section id='sidebar'>...</b:section>
 
 
 
 
 
 
 
 
 
 
 
 
  <b:section id='footer'>...</b:section>
</body>

</html>


Outer wrapperBodyTempleteMain wrapperPostFooter
Widget 2
Widget 3
Sidebar
Widget 1
Header
Widget 3

How to design blogger template on XML code ~ Digital Hub Inc.
http://www.digitalhubinc.com/2013/03/How-to-design-blogger-template-on-XML-code.html

Bloggerのテンプレートの構造と編集方法(3)-実際の記述ー

ついに実際のコードにたどり着きました。
制御構造とデータについて説明します。

ブログ全体や投稿のデータを読出し、それを制御して成形してウィジットとして表示していく、実際の処理の部分の記載方法について示します。
  1. Bloggerのテンプレートの構造と編集方法(1)-ブログシステム全体像-
  2. Bloggerのテンプレートの構造と編集方法(2)-テンプレートの全体像-
  3. Bloggerのテンプレートの構造と編集方法(3)-実際の記述-(この記事)

Bloggerのテンプレートの構造と編集方法(1)-ブログシステム全体像-

テンプレート事始め

blogのテンプレートというものを、Bloggerにて初めて開いたのですが、想像していたのと違って、大量のコードがずらずら出てきます。しかも、ネスティングやループが多重に使われていて理解不能でした。そこで、Bloggerのテンプレート構造を理解したときの流れをメモします。
  1. Bloggerのテンプレートの構造と編集方法(1)-ブログシステム全体像-(この記事)
  2. Bloggerのテンプレートの構造と編集方法(2)-テンプレートの全体像-
  3. Bloggerのテンプレートの構造と編集方法(3)-実際の記述-

Bloggerのメインページの投稿の上にコンテンツを表示する

Bloggerではレイアウトの制限があるため、GUIからは投稿の上の部分に同じ幅でウィジットや独自コンテンツを入力することはできません。しかし、Templete>Edit HTMLから以下のように編集してやることで、独自のコンテンツを投稿の上に表示することができます。

注意事項

テンプレートの構造全体を把握できていないので、以下のコードは既存のテンプレートを破壊する恐れがあります。現在のテンプレートのバックアップ、復元方法が分からない方は決して使用しないでください。

 コード

強調した行の部分をテンプレートのHTMLに追加して使用します。
コード中のTitleとContentは実際に使うものに編集してください。いずれにもHTMLタグを使用することが出来ます。
使い途は色々考えられますが、「このサイトについて」、「サイトマップ」、「注目記事」、「共通の断り書き」などに適しているかと思います。

コード中で、if文は現在のページがブログのトップページであることを確認するために使っています。Titleのタグは他のウィジットにならってh2とし、Contentのタグもdivにクラス属性をwidget-conentとしています。
...
<b:includable id='main' var='top'>
  <b:if cond='data:mobile == "false"'>
  <!-- posts -->
  <div class='blog-posts hfeed'>
    <b:include data='top' name='status-message'/>
    <b:if cond='data:blog.url == data:blog.homepageUrl'>
      <h2>
        Title
      </h2>
      <div class="widget-content">
        Content
      </div><br/>
    </b:if>
 ...

April 4, 2014

Excelのセル範囲の中心に図形を配置する

使い方

図形を複数のセル範囲の中央に配置するマクロを作成しました。
配置後に、セル範囲のセルを結合することで、いわゆるエクセル方眼紙のユーザーにとって使いやすい仕様にしました。

Excelの図の位置をセルの中心に

写真や図形をセルの中心に並べたい

Excelは表形式のデータを柔軟に編集できるため、簡単なレイアウトツールやワープロ替わりに使うことができます(是非はさておき)。

表形式に図形を並べる場合、セルの枠線を表の線として利用すると思うのですが、図形と枠線の間に適当な余白を設ける場合、図形をセルの中心に持ってきたくなりますが、いちいち手作業で修正するのは大変です。

そこで、図形を選択して実行するだけで、図形の中心をセルの中心に合わせるマクロを作成しました。

Excelのオブジェクトの中心にあるセルを求める

TopLeftCell、BottomRightCellはあるが、CenterCellはない

Excel VBAにはTopLeftCell、 BottomRightCellというプロパティがあり、それぞれ、オブジェクトの左上、右下にあるセルをRangeオブジェクトとして取得できます。
ところが、オブジェクトの真ん中にあるセルを求めるプロパティはないため、ユーザー定義関数を作成しました。

April 3, 2014

textareaに定型文を入力するブックマークレット

手間を省きたい

毎回使うわけではないけれど、たまに使う定型文の管理をどのようにしていますか。IMEに単語登録してしまうのも一つの手ですが、ブログの編集作業などWebブラウザで作業するならブックマークレットを使うこともできます。

ブラウザ作業の自動化、というときに、一つの解答方法がブックマークレットを使うことです。今となってはレガシーな手法かもしれませんが、簡単で便利な仕組みです。

なお、Firefox 28, Internet Explorer 11でしか動作確認していません。

Table Editorで簡単にhtmlの表組みをする

タグを打つのは大変だ

HTMLの表組みを直打ちするにはtable, tbody, tr, th, tdとタグを使わなければならず、煩雑な作業になってしまいます。
そういうときには、オンラインで便利なツールがあるので活用しましょう。
値を入力するだけで、表組みができ、CSVでのインポート・エクスポートにも対応しており、いうことなしです。
truben / Table Editor
http://truben.no/latex/table/

VBと類似したプログラミング環境について

Visual Basicに類似したプログラミング環境

VBは、コンパイルによってアプリケーションを作成できる独立したプログラミング言語ですが、Windowsでは類似した文法を持つ言語が目的に応じて用意されています。これらは類似しているとはいえ、それぞれに違いがあり、コードをそのまま相互に移し替えてもエラーが発生してしまいます。
この記事では、言語環境を変えるときに、どのような違いがあり、どうすればよいのか、を示します。

BloggerでSyntaxHighlighterをもっと簡単に使うには

SyntaxHighlighterをもっと便利に

コードをきれいに色付けして表示してくれるライブラリです。Bloggerにも数行のhtmlとJavascriptコードを書くだけ で簡単に導入することが出来ます。
しかし、毎回毎回、以下のようなHTMLモードに切り替えて以下のようなコードを書くのは手間がかかります。そこで、もっと簡単に適用する方法があります。
<link href="http://alexgorbatchev.com/pub/sh/current/styles/shCore.css" rel="stylesheet" type="text/css"></link>
<link href="http://alexgorbatchev.com/pub/sh/current/styles/shThemeDefault.css" rel="stylesheet" type="text/css"></link>
<script src="http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js" type="text/javascript"></script>
<script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJScript.js" type="text/javascript"></script>
<br />
<pre class="brush: js">
//ここに表示させたいコードを入力する 
function foo()
{
}
</pre>
<script type="text/javascript">
 SyntaxHighlighter.all()
</script>
//ここに表示させたいコードを入力する 
function foo()
{
}
found, known and done. / Bloggerにコードをハイライトして表示するには(SyntaxHilighter)
http://foundknownanddone.blogspot.jp/2014/02/bloggersyntaxhilighter.html

この記事では、一通り考え方を解説した後にまとめたコードを示します。

April 2, 2014

Excel VBAからVBScript(WSH)へ変換するときに注意すること

似ているので簡単…?

VBAとVBScriptは文法が似ているので、VBAに慣れている人ならば、簡単にVBScriptが書ける、という記事をよく見かけます。ところが、自分でVBAを初めてVBScriptに移し替えると意外とつまづくポイントが沢山あったので、メモします。
なお、以下ではExcel VBAからVBScriptの場合について書いていますので、Word VBA、PowerPoint VBA等を使われている場合は、適宜読み替えてください。
found, known and done / VBと類似したプログラミング環境についてhttp://foundknownanddone.blogspot.jp/2014/04/vb.html 

まず、何をするのか。

色々なサイトでよく以下のように書いてあります。
  • 新規テキストファイルを作成します。
  • VBAのコードをコピーして、そのファイルにペーストします。
  • 拡張子を.vbsにして保存します。
  • .vbsファイルをダブルクリックして実行します。
    (必要に応じて、vbsをWindows Scripting Hostに関連付けます。)
この手順は確かに正しいのです。しかし、これだけではダブルクリックでスクリプトがスムースに動くことはなく、大抵の場合はエラーが出ます。
では、どうするのか、をこの記事で解説します。