2009年01月29日

行と列を入れ替える

Excel(エクセル)のワークシート内で、1列に入力されているデータを、1行のデータとして入れ替えたい場合があります。
例えば以下のような例です。

(元データ)
-----            
 A1
-----
 A
 B
 C

(入れ替え後)
-------------------------------
 B1    C1    D1    E1 
-------------------------------
 A     B     C     D

「形式を選択して貼り付け」を利用すると行と列を入れ替えてコピーすることができます。

 (元データ)を選択してコピーします。
 コピー先(上の場合ではB1)を選択します。
 [編集]メニュー→[形式を選択して貼り付け]→[行列を入れ替える]チェックボックスを
 オンにして[OK]ボタンを押します。

Excel(エクセル)関連のセミナー中のデモで利用すると、時々ご質問を頂くことがあります。
使用頻度はそれほど高くはありませんが、ちょっとした表の変換作業に使えますので便利ですね。

posted by Three bit com at 10:00| Excel(エクセル)

2009年01月25日

選択範囲にデータ入力

先日のExcelVBA(エクセルマクロ)の入門セミナーで面白いご質問を頂きました。
Excelのリストやデータベース(Access他)と組み合わせてプログラミングすると、便利なツールが作れるかも知れませんので、ご紹介いたします。

ドラッグされているセル範囲にデータを連続書き込みするためのプログラムです。
セル範囲をどのように認識するかがポイントですが、いくつか方法があると思います。

ここでは選択範囲の行数と列数を求めて、縦の行数分を繰り返すForの処理に加え、
横の列数分だけ繰り返すForの処理を追加してみました。
ExcelVBA入門セミナーレベルで繰り返し処理を始めて使う方には、Forの中にForを入れる繰り返し処理をマスターする練習になるかも知れません。

プログラムを見ただけではピンと来ない場合は、F8(ステップイン)を使ってExcelの動きを見ながら考えてみると分かりやすいと思います。

Sub 選択範囲にデータ入力()
  Dim 行数 As Long
  Dim 列数 As Integer

  行数 = Selection.Rows.Count '選択範囲の行数を数える
  列数 = Selection.Columns.Count '選択範囲の列数を数える

  '横の列数分だけ繰り返すためのFor
  For 横カウンタ = 0 To 列数 - 1
    '縦の行数分だけ繰り返すためのFor
    For 縦カウンタ = 0 To 行数 - 1
       ActiveCell.Offset(縦カウンタ, 横カウンタ).Value = "A"
    Next 縦カウンタ '次の行へ
  Next 横カウンタ '次の列へ
End Sub

基本的なVBAの文法を学習しただけでも、Excelでの実務経験が多い場合には面白いアイディアが色々と出てきますね。こういうところがExcelの面白さでもあると思いました。
posted by Three bit com at 10:00| Excel(エクセル)

2009年01月17日

未定の関数エラー

Access(アクセス)のヘルプにも出ている関数を使っているし、他の人のPCではちゃんと動くのに、自分のPCではなぜか動かない、というご質問をAccess関連のセミナーで伺うことがあります。

拝見してみると、
Access(アクセス)のクエリを開こうとすると
「式に未定義関数 '○○○' があります」
というエラーが表示されて実行できないケースです。

この場合、まず確認して頂きたいのが「参照設定」です。
Alt+F11を押して、VBEを起動して、[ツール]メニューから[参照設定]を確認してください。

[参照設定] ダイアログボックスに
[参照不可:○○○・・・] という項目にチェック ボックスがオンになっている参照があるようでしたら、その参照へのチェックボックスをオフにするとエラーが出なくなります。
posted by Three bit com at 10:00| Access(アクセス)

2009年01月09日

レポートの背景色

Accessのセミナーで、レポートに罫線を効率的に作成する方法をご質問頂くことが少なくありません。

Access以外の例えばVB、VB.NET、PHPなどを使ってWindowsフォームやWebアプリを作成する場合を考えると、それでもAccessのレポートはずっと簡単なのですが、Excel(エクセル)の簡便さに比べると、やはり手間がかかるという印象は強いように思います。

罫線を作成する代わりに、VBAを使って背景色を1行おきに変更して対処している例をよく拝見します。

考え方のポイントで基本となるのは
レポート「詳細」セクションの「フォーマット時」イベント
だと思います。

レコードを1行ずつ読み取るごとに「フォーマット時」というイベントが発生しますので、フォーマット時イベントに、
例えば、奇数行ならば、詳細セクションの背景色をグレーにし、それ以外なら(偶数行なら)、詳細セクションの背景色を白くする、という考え方になります。

色々な書き方がありますが、例えば簡単な例を1つ書いてみると以下のようになります。

Dim i As Long  'この行は宣言セクションに記載します。

Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)
  i = i + 1
  If i Mod 2 = 1 Then '2で割った余りを求め、それが1と等しいかどうか判断しています。
    詳細.BackColor = 16777215  '白
  Else '条件に該当しない2で割った余りが 0となる場合です。偶数行が該当します。
    詳細.BackColor = 12632256 'グレー
  End If
End Sub

1レコードずつ読み取られてる度にフォーマット(Format)イベントが発生することを理解しておくと、他にも活用範囲が広がりますので、レポートの大事なイベントの一つだろうと思います。

posted by Three bit com at 10:00| Access(アクセス)