○第70回目 図形編(その8) 図形に色を塗る、コネクタを全部削除、図形の整列
※マクロはエクセル2007でのものです。
6.図形に色をつける
色の道は難しいと昔から言いますが、本当にそうです。いろいろありすぎてどこに焦点を定めたらいいのかわからないのです。ということで、色をパターン化することにします。
機械的には、どのくらいパターンがあるのかは不明です。突き止める気も起こりません。ただその一端を垣間見なければ進まないので垣間見てみることにします。
ワークシートに、1から64ぐらいまでの連番を縦に振ってください。
そして、その番号を指定して、"図形の一括作成"を動かしてみてください。図形の種類は面取り長方形です。これでは何も起こらないので、
この中に、次のコマンドを入れてください。
Selection.ShapeRange.Fill.ForeColor.SchemeColor = i
すると、図形を描いた後で、色が付加され、その後それらが表示されます。
それを見て、標準値にしたい色のパターンを選んでください。
筆者はパステルカラー系のものを選びました。
その番号を指定することが今回のメインです。
手順を記すと、
1.色をつける図形の範囲を入力する
2.色番号を入力する。これには透明度の指定も含めます
3-1.入力された色番号で指定の図形に色を塗ります。
3-2.指定された透明度を適用します
1.は、毎度おなじみの…なので、省略します。
2.は、(この色群はパステルカラー系です)
iro = InputBox("色番号を入力してください。 " & vbCrLf & _
"40=⇒ 青色 " & vbCrLf & _
"41=⇒ 水色 " & vbCrLf & _
"42=⇒みどり " & vbCrLf & _
"43=⇒黄色" & vbCrLf & _
"44=⇒藍色 " & vbCrLf & _
"45=⇒ピンク " & vbCrLf & _
"46=⇒ムラサキ " & vbCrLf & _
"47=⇒オレンジ " & vbCrLf & _
"1=⇒白 " & vbCrLf & _
"0=⇒透明 " & vbCrLf & _
" " & vbCrLf _
, xpos:=2000, ypos:=3000, Default:=11)
'※通常の色系では、SchemeColor = 10 '赤、13 '黄色、11 '黄緑、9 '白
3-1、は、
ActiveSheet.Shapes(i).Select
Selection.ShapeRange.Fill.ForeColor.SchemeColor = iro
※単純極まりません。
3-2.は、更に透明度の入力をし、その内容で処理します。透明度は100%透明は色なしです。
toumei_do = InputBox("透過度を入力してください。0-1.0 " & vbCrLf & _
" " & vbCrLf _
, xpos:=2000, ypos:=3000, Default:=0.5)
透明にするのは、
ActiveSheet.Shapes(i).Select
Selection.ShapeRange.Fill.Transparency = toumei_do
です。
※これも単純極まりません。
7.コネクタを全部削除
これは今までのものの簡単な応用です。
もとのマクロは、"図形の削除"です。
図形の名前で、カギ型コネクタを判定するのは、"カギ型"になります。コネクタという名称では直線が含まれてしまいます。厳密にコネクタの役割をしたものを選ぶとなると難しいということになりますが、直線は単純な線という位置づけでいくと、"カギ型"という名称がポイントになります。
図形の名前を取得して、その中に、"カギ型"という文字が含まれている図形だけを削除することになります。
おしまい。
いろいろな試行錯誤の結果、現在では次のようにしています。
ActiveSheet.Shapes(i).Select
return_V1 = Selection.ShapeRange.Connector
If return_V1 = -1 And InStr(mm2(i), "直線コネクタ") = 0 Then
ActiveSheet.Shapes(i).Delete
' End If
End If
8.図形の整列(図形群の横軸をそろえる、縦軸をそろえる、横に均等配置する、縦に均等配置する)
これはうまくいきません。
処理対象となる図形をセットするところが難しいのです。
対応は次回以降。
2007年12月29日土曜日
2007年12月27日木曜日
第69回目 図形編(その7) 直線を引く、線の太さ・矢印
○第69回目 図形編(その7) 直線を引く、線の太さ・矢印
※マクロはエクセル2007でのものです。2003でも動きました。
4.直線を引く(水平、垂直線)
この機能は、図形の一括作成(第64回)の機能の中に、図形の種類の追加として付加します。
1.入力画面表示へ追加
2セレクト文の追加
対応は、次のようになります。
1.
z_form = InputBox("図計の種類を入れてください。" & vbCrLf & _
"1=⇒面とり長方形" & vbCrLf & _
"2=⇒楕円" & vbCrLf & _
"3=⇒爆発" & vbCrLf & _
"4=⇒吹き出し" & vbCrLf & _
"5=⇒直線(水平)" & vbCrLf & _
"6=⇒直線(垂直)" & vbCrLf & _
" " & vbCrLf _
, xpos:=2000, ypos:=3000, Default:=1)
2.
Case "5" '直線(水平)
ActiveSheet.Shapes.AddLine(80.25, 840#, 309#, 840#).Select
Case "6" '直線(垂直)
ActiveSheet.Shapes.AddLine(82.5, 875.25, 82.5, 972#).Select
というような追加をしておけば、対応終了です。
ついでに、右向きの矢印の図形の必要な文も追加しておきます。
"7=⇒大きな矢印;右向き" & vbCrLf & _
Case "7"
ActiveSheet.Shapes.AddShape(msoShapeRightArrow, 231.75, 178.5, 73.5, 59.25).Select
おしまい。
5.線、コネクタの線の太さ、矢印の向きの修正
この処理は、図形の範囲を指定します。その中でライン関係のものだけ処理します。
1.対象とする図形の範囲を入力する
2.太さか矢印かの区分を入力する
3-1.太さの場合、線の幅を入力する。
3-2.矢印の場合、矢印の向き(なし、右向き、左向き、両方に矢印)を入力する。
4-1.太さの変更
4-2.矢印の向きの変更
1.は省略。
2.は
kubun = InputBox("処理区分を入れてください。" & vbCrLf & _
"1=⇒太さの指定" & vbCrLf & _
"2=⇒矢印の指定" & vbCrLf & _
" " & vbCrLf _
, xpos:=2000, ypos:=3000, Default:=1)
※図形の数はどこかの段階で求めておいてください。
ii9 = ActiveSheet.Shapes.Count
同時に、図形の名前を取得します
For i = 1 To ii9
ActiveSheet.Shapes(i).Select
mm2(i) = Selection.Name
Next i
3-1.は、
'太さの入力
hutosa = InputBox("太さを入力してください。0.25単位で近いところにします ", , 2)
hutosa = Int((hutosa * 4 + 0.5)) / 4
4-1は、
図形の名前から、ラインまたはコネクタかどうかの判断し、ライン等の場合、太さを修正します。
'コネクタかどうか、ラインかどうか
return_V1 = Selection.ShapeRange.Connector
If (return_V1 = -1) Or InStr(mm2(i), "Line") <> 0 Then
Selection.ShapeRange.Line.Weight = hutosa
End If
3-2は、
muki = InputBox("矢印の向きを入力してください。" & vbCrLf & _
"0=⇒ なし" & vbCrLf & _
"1=⇒ 右へ ――→" & vbCrLf & _
"2=⇒ 左へ ←――" & vbCrLf & _
"3=⇒ 両方 ←―→" & vbCrLf & _
" " & vbCrLf _
, xpos:=2000, ypos:=3000, Default:=1)
4-2は、
図形の名前から、ラインまたはコネクタかどうかの判断し、ライン等の場合矢印の向きを修正します。
'コネクタかどうか、ラインかどうか
return_V1 = Selection.ShapeRange.Connector
If (return_V1 = -1) Or InStr(mm2(i), "Line") <> 0 Then
Select Case muki
'なし
Case "0"
Selection.ShapeRange.Line.BeginArrowheadStyle = msoArrowheadNone
Selection.ShapeRange.Line.EndArrowheadStyle = msoArrowheadNone
' ――→
Case "1"
Selection.ShapeRange.Line.BeginArrowheadStyle = msoArrowheadNone
Selection.ShapeRange.Line.EndArrowheadStyle = msoArrowheadTriangle
' ←――
Case "2"
Selection.ShapeRange.Line.BeginArrowheadStyle = msoArrowheadTriangle
Selection.ShapeRange.Line.EndArrowheadStyle = msoArrowheadTriangle
' ←―→
Case "3"
Selection.ShapeRange.Line.BeginArrowheadStyle = msoArrowheadTriangle
Selection.ShapeRange.Line.EndArrowheadStyle = msoArrowheadTriangle
Case Else
Exit Sub
End Select
End If
おしまい
※コマンドとして何を使うのかが核心です。
コマンドの意味は、見ていただけばわかると思います
長くなりましたので、"6.図形に色をつける"は次回に回します・
※マクロはエクセル2007でのものです。2003でも動きました。
4.直線を引く(水平、垂直線)
この機能は、図形の一括作成(第64回)の機能の中に、図形の種類の追加として付加します。
1.入力画面表示へ追加
2セレクト文の追加
対応は、次のようになります。
1.
z_form = InputBox("図計の種類を入れてください。" & vbCrLf & _
"1=⇒面とり長方形" & vbCrLf & _
"2=⇒楕円" & vbCrLf & _
"3=⇒爆発" & vbCrLf & _
"4=⇒吹き出し" & vbCrLf & _
"5=⇒直線(水平)" & vbCrLf & _
"6=⇒直線(垂直)" & vbCrLf & _
" " & vbCrLf _
, xpos:=2000, ypos:=3000, Default:=1)
2.
Case "5" '直線(水平)
ActiveSheet.Shapes.AddLine(80.25, 840#, 309#, 840#).Select
Case "6" '直線(垂直)
ActiveSheet.Shapes.AddLine(82.5, 875.25, 82.5, 972#).Select
というような追加をしておけば、対応終了です。
ついでに、右向きの矢印の図形の必要な文も追加しておきます。
"7=⇒大きな矢印;右向き" & vbCrLf & _
Case "7"
ActiveSheet.Shapes.AddShape(msoShapeRightArrow, 231.75, 178.5, 73.5, 59.25).Select
おしまい。
5.線、コネクタの線の太さ、矢印の向きの修正
この処理は、図形の範囲を指定します。その中でライン関係のものだけ処理します。
1.対象とする図形の範囲を入力する
2.太さか矢印かの区分を入力する
3-1.太さの場合、線の幅を入力する。
3-2.矢印の場合、矢印の向き(なし、右向き、左向き、両方に矢印)を入力する。
4-1.太さの変更
4-2.矢印の向きの変更
1.は省略。
2.は
kubun = InputBox("処理区分を入れてください。" & vbCrLf & _
"1=⇒太さの指定" & vbCrLf & _
"2=⇒矢印の指定" & vbCrLf & _
" " & vbCrLf _
, xpos:=2000, ypos:=3000, Default:=1)
※図形の数はどこかの段階で求めておいてください。
ii9 = ActiveSheet.Shapes.Count
同時に、図形の名前を取得します
For i = 1 To ii9
ActiveSheet.Shapes(i).Select
mm2(i) = Selection.Name
Next i
3-1.は、
'太さの入力
hutosa = InputBox("太さを入力してください。0.25単位で近いところにします ", , 2)
hutosa = Int((hutosa * 4 + 0.5)) / 4
4-1は、
図形の名前から、ラインまたはコネクタかどうかの判断し、ライン等の場合、太さを修正します。
'コネクタかどうか、ラインかどうか
return_V1 = Selection.ShapeRange.Connector
If (return_V1 = -1) Or InStr(mm2(i), "Line") <> 0 Then
Selection.ShapeRange.Line.Weight = hutosa
End If
3-2は、
muki = InputBox("矢印の向きを入力してください。" & vbCrLf & _
"0=⇒ なし" & vbCrLf & _
"1=⇒ 右へ ――→" & vbCrLf & _
"2=⇒ 左へ ←――" & vbCrLf & _
"3=⇒ 両方 ←―→" & vbCrLf & _
" " & vbCrLf _
, xpos:=2000, ypos:=3000, Default:=1)
4-2は、
図形の名前から、ラインまたはコネクタかどうかの判断し、ライン等の場合矢印の向きを修正します。
'コネクタかどうか、ラインかどうか
return_V1 = Selection.ShapeRange.Connector
If (return_V1 = -1) Or InStr(mm2(i), "Line") <> 0 Then
Select Case muki
'なし
Case "0"
Selection.ShapeRange.Line.BeginArrowheadStyle = msoArrowheadNone
Selection.ShapeRange.Line.EndArrowheadStyle = msoArrowheadNone
' ――→
Case "1"
Selection.ShapeRange.Line.BeginArrowheadStyle = msoArrowheadNone
Selection.ShapeRange.Line.EndArrowheadStyle = msoArrowheadTriangle
' ←――
Case "2"
Selection.ShapeRange.Line.BeginArrowheadStyle = msoArrowheadTriangle
Selection.ShapeRange.Line.EndArrowheadStyle = msoArrowheadTriangle
' ←―→
Case "3"
Selection.ShapeRange.Line.BeginArrowheadStyle = msoArrowheadTriangle
Selection.ShapeRange.Line.EndArrowheadStyle = msoArrowheadTriangle
Case Else
Exit Sub
End Select
End If
おしまい
※コマンドとして何を使うのかが核心です。
コマンドの意味は、見ていただけばわかると思います
長くなりましたので、"6.図形に色をつける"は次回に回します・
2007年12月22日土曜日
第68回目 図形編(その6) 図形の削除、図形番号の付加、大きさ変更
○第68回目 図形編(その6) 図形の削除、図形番号の付加、大きさ変更
※マクロはエクセル2007でのものです。2003でも動きました。
1.図形の削除(図形番号を指定。範囲指定も可とする)
このマクロはほとんど、入力された図形番号の分析となります。
範囲の与え方としては、0(全部)、3、2-8、-5、4-を考えます。
どこかでやっていますが、ポイントは-の位置になります。
ないケース、先頭にあるケース、末尾にあるケース、それ以外にあるケース。
それぞれにわけて入力値を分解していきます。当然ながら最後は、すでにある図形の数(ii9 = ActiveSheet.Shapes.Count)となります。
入力から分解です
z_no = InputBox("削除したい図形の番号を入力してください。 " & ii9 & " 以内", , "0")
p1 = InStr(z_no, "-")
If p1 = 1 Then '先頭に-がある場合
no1 = 1
no9 = Val(Mid(z_no, p1 + 1)) 'Valは数値変換する関数
Else
If p1 = Len(z_no) Then '末尾に-がある場合
no1 = Val(Left(z_no, p1 - 1))
no9 = ii9
Else
If p1 <> 0 Then '先頭、末尾以外の場所に-がある場合
no1 = Val(Left(z_no, p1 - 1))
no9 = Val(Mid(z_no, p1 + 1))
Else
あとは0の場合と、単独の場合ですので自分で考えてください。
削除のコマンドは
ActiveSheet.Shapes(i).Delete です。
ここで注意点があります。
頭から削除してすると、後の図形番号が一つずつ小さくなり変わってしまうのです。
ですから、最後から削除していきます。
そのために、for文の更新を-1にしていきます。stepで与えます。
For i = no9 To no1 Step -1
おしまい。
2.図形のテキストに図形番号を付加するまたは図形番号を削除する
(図を見ただけで番号がわかるようにします。不要になれば消せます)
これは当然、線とかコネクタにはつきません。エラーになるので、エラーになった場合は回避します。
付加する形は、_12___XXXXXX、アンダーバー1つと、アンダーバー3つとで番号を囲みます。これが付加されている番号の特徴となります。
1.全部の図形のテキストを取得して、それに図形番号がついていなければつけます。ついていれば、それを削除します。
全部が対象になりますので、処理は、"1からii9 = ActiveSheet.Shapes.Count"までとなります。
ActiveSheet.Shapes(i).Select
mm1 = Selection.Characters.Text
p1 = InStr(mm1, "___") 'p1は最初のアンダーバーの文字位置となります
If p1 = 0 Then '特殊文字がついていないので付加します
Selection.Characters.Text = "_" & i & "___" & mm1
Else '特殊文字がついているので削除します
Selection.Characters.Text = Mid(mm1, p1 + 3)
End If
おしまい。
※いい忘れましたが、セルの座標の取得は必要ないのですが、最初にセルの座標を取得しておいて、最後にそのセルにフォーカスを戻してください。忘れますと図形にフォーカスが移ったままとなります。
最初と最後に、それぞれ記述しておいてください。
最初; AAA = Selection.Address
最後; Range(AAA).Select
3.大きさの修正(倍率を指定。縦横同時のみならず、縦だけ、横だけも可とする)
範囲指定も可能とします。
1.大きさを修正する図形の範囲を入力する
2.大きさ変更の種類を入力する
3.倍率を入力する。100を基準とする
4.大きさを計算して、図形の大きさを変更する
1.は、大きな《1.》で出てきました。
2.は、これも定番です。
'処理区分の入力。
kubun = InputBox("処理区分を入れてください。" & vbCrLf & _
"1=⇒縦横同時変更" & vbCrLf & _ '"vbCrLf"は改行のこと
"2=⇒縦のみ変更" & vbCrLf & _
"3=⇒横のみ変更" & vbCrLf & _
" " & vbCrLf _
, xpos:=2000, ypos:=3000, Default:=1)
3.は、初期値として120を設定しました。
4.は…
まずは、大きさの計算です。そのために最初の大きさを取得します。
ActiveSheet.Shapes(i).Select
hig = Selection.ShapeRange.Height
wid = Selection.ShapeRange.Width
となります。
変更後の大きさは、0.25刻みにします。
hig2 = Int(hig * (h_rate / 100) * 4 + 0.5) / 4 'h_rateは倍率
wid2 = Int(wid * (w_rate / 100) * 4 + 0.5) / 4 'w_rateは倍率
図形の大きさを変更するコマンドは、
Selection.ShapeRange.Height = hig2
Selection.ShapeRange.Width = wid2
です。
ほとんど既存のものを使いまわせますので、簡単に出来ます。
おしまい。
※マクロはエクセル2007でのものです。2003でも動きました。
1.図形の削除(図形番号を指定。範囲指定も可とする)
このマクロはほとんど、入力された図形番号の分析となります。
範囲の与え方としては、0(全部)、3、2-8、-5、4-を考えます。
どこかでやっていますが、ポイントは-の位置になります。
ないケース、先頭にあるケース、末尾にあるケース、それ以外にあるケース。
それぞれにわけて入力値を分解していきます。当然ながら最後は、すでにある図形の数(ii9 = ActiveSheet.Shapes.Count)となります。
入力から分解です
z_no = InputBox("削除したい図形の番号を入力してください。 " & ii9 & " 以内", , "0")
p1 = InStr(z_no, "-")
If p1 = 1 Then '先頭に-がある場合
no1 = 1
no9 = Val(Mid(z_no, p1 + 1)) 'Valは数値変換する関数
Else
If p1 = Len(z_no) Then '末尾に-がある場合
no1 = Val(Left(z_no, p1 - 1))
no9 = ii9
Else
If p1 <> 0 Then '先頭、末尾以外の場所に-がある場合
no1 = Val(Left(z_no, p1 - 1))
no9 = Val(Mid(z_no, p1 + 1))
Else
あとは0の場合と、単独の場合ですので自分で考えてください。
削除のコマンドは
ActiveSheet.Shapes(i).Delete です。
ここで注意点があります。
頭から削除してすると、後の図形番号が一つずつ小さくなり変わってしまうのです。
ですから、最後から削除していきます。
そのために、for文の更新を-1にしていきます。stepで与えます。
For i = no9 To no1 Step -1
おしまい。
2.図形のテキストに図形番号を付加するまたは図形番号を削除する
(図を見ただけで番号がわかるようにします。不要になれば消せます)
これは当然、線とかコネクタにはつきません。エラーになるので、エラーになった場合は回避します。
付加する形は、_12___XXXXXX、アンダーバー1つと、アンダーバー3つとで番号を囲みます。これが付加されている番号の特徴となります。
1.全部の図形のテキストを取得して、それに図形番号がついていなければつけます。ついていれば、それを削除します。
全部が対象になりますので、処理は、"1からii9 = ActiveSheet.Shapes.Count"までとなります。
ActiveSheet.Shapes(i).Select
mm1 = Selection.Characters.Text
p1 = InStr(mm1, "___") 'p1は最初のアンダーバーの文字位置となります
If p1 = 0 Then '特殊文字がついていないので付加します
Selection.Characters.Text = "_" & i & "___" & mm1
Else '特殊文字がついているので削除します
Selection.Characters.Text = Mid(mm1, p1 + 3)
End If
おしまい。
※いい忘れましたが、セルの座標の取得は必要ないのですが、最初にセルの座標を取得しておいて、最後にそのセルにフォーカスを戻してください。忘れますと図形にフォーカスが移ったままとなります。
最初と最後に、それぞれ記述しておいてください。
最初; AAA = Selection.Address
最後; Range(AAA).Select
3.大きさの修正(倍率を指定。縦横同時のみならず、縦だけ、横だけも可とする)
範囲指定も可能とします。
1.大きさを修正する図形の範囲を入力する
2.大きさ変更の種類を入力する
3.倍率を入力する。100を基準とする
4.大きさを計算して、図形の大きさを変更する
1.は、大きな《1.》で出てきました。
2.は、これも定番です。
'処理区分の入力。
kubun = InputBox("処理区分を入れてください。" & vbCrLf & _
"1=⇒縦横同時変更" & vbCrLf & _ '"vbCrLf"は改行のこと
"2=⇒縦のみ変更" & vbCrLf & _
"3=⇒横のみ変更" & vbCrLf & _
" " & vbCrLf _
, xpos:=2000, ypos:=3000, Default:=1)
3.は、初期値として120を設定しました。
4.は…
まずは、大きさの計算です。そのために最初の大きさを取得します。
ActiveSheet.Shapes(i).Select
hig = Selection.ShapeRange.Height
wid = Selection.ShapeRange.Width
となります。
変更後の大きさは、0.25刻みにします。
hig2 = Int(hig * (h_rate / 100) * 4 + 0.5) / 4 'h_rateは倍率
wid2 = Int(wid * (w_rate / 100) * 4 + 0.5) / 4 'w_rateは倍率
図形の大きさを変更するコマンドは、
Selection.ShapeRange.Height = hig2
Selection.ShapeRange.Width = wid2
です。
ほとんど既存のものを使いまわせますので、簡単に出来ます。
おしまい。
2007年12月19日水曜日
第67回目 図形編(その5) 図形と図形を結ぶ
○第67回目 図形編(その5) 図形と図形を結ぶ
今回はコネクタが出てきます。図形をつなぎ、連携関係を表すものです。
コネクタは、カギ型を使用します。直角が多く出るので図にキレが生じます。
コネクタで必要な条件は、どの図形とどの図形をどの場所でどの場所で結ぶかということです。パラメータは4つあります。
場所とは、大体は図形の上中央、左中央、下中央、右中央の4つです。
上の図形の下中央から、下の図形の上中央を結ぶ、という感じになります。
4つのセットを必要なだけ用意しておいて、これを読み込ませ、この条件でコネクタを引いてください、というのが、マクロの流れとなります。
0.事前に4項目(コネクタの元と先の図形番号とそれぞれのコネクタをつける場所。)のセットを作っておき、その場所を選択しておく。

1.パラメータを取得する
2.パラメータの内容に基づきコネクタを引く
1.は基本コマンドなので省略します。
コネクタ(カギ型です)を引くコマンドは次の通りです。
ActiveSheet.Shapes.AddConnector(msoConnectorElbow, 283.5, 405#, 7.5, 48# _
).Select
コネクタの先を矢印型にする
Selection.ShapeRange.Line.EndArrowheadStyle = msoArrowheadTriangle
線の太さ
Selection.ShapeRange.Line.Weight = 1.25
コネクタ開始の図形とその場所
Selection.ShapeRange.ConnectorFormat.BeginConnect ActiveSheet.Shapes(z_no1(i)), kone1(i)
Shapes(z_no1(i)) のカッコ内が図形の番号です
kone1(i) のカッコ内が結ぶ場所の番号です
コネクタ先の図形とその場所
Selection.ShapeRange.ConnectorFormat.EndConnect ActiveSheet.Shapes(z_no9(i)), kone9(i)
Shapes(z_no9(i)) のカッコ内が図形の番号です
kone9(i) のカッコ内が結ぶ場所の番号です
これを必要なだけ繰り返します。
このマクロのメリットは、机上で設計が出来、そのままパラメータとして与えられる点です。
一旦コネクタで結べば、もとの図形を動かしても大丈夫です。
それでは、コネクタを引きなおしたいというニーズに対してはどうするのでしょうか。
現在では、特定のコネクタを指定して、引き直すというやり方はとっていません。一旦削除(これはマクロ)して、改めて引き直すという方法をとっています。これはコネクタの図形番号がわかりにくいということによります。
具体的手順は次のようになります。
1.一旦引いた後、"図形のテキスト、名前等の取得・書き込み"(第65回目参照)で、コネクタ群の図形番号を把握します。
2.その番号を指定して、図形を削除します。(今後登場予定)
3.コネクタのパラメータを修正して、改めてコネクタを引きます。
今回までで、組織図とか流れ図などかなりの部分は作成可能となります(間違った場合はその部分を手で削除して作り直してください)。
エクセルシートを文書と見立てれば、ワード感覚の資料が出来ます。
次からは補助機能を紹介します。
1.今回話題になった削除(図形番号を指定。範囲指定も可とする)
2.図形のテキストに図形番号を付加するまたは図形番号を削除する
(図を見ただけで番号がわかるようにします。不要になれば消せます)
3.大きさの修正(倍率を指定。縦横同時のみならず、縦だけ、横だけも可とする)
4.直線を引く(水平、垂直線)
5.線、コネクタの線の太さ、矢印の向きの修正
6.図形に色をつける
7.コネクタを全部削除
もひとつおまけに、
8.図形の整列(図形群の横軸をそろえる、縦軸をそろえる、横に均等配置する、縦に均等配置する)
今回はコネクタが出てきます。図形をつなぎ、連携関係を表すものです。
コネクタは、カギ型を使用します。直角が多く出るので図にキレが生じます。
コネクタで必要な条件は、どの図形とどの図形をどの場所でどの場所で結ぶかということです。パラメータは4つあります。
場所とは、大体は図形の上中央、左中央、下中央、右中央の4つです。
上の図形の下中央から、下の図形の上中央を結ぶ、という感じになります。
4つのセットを必要なだけ用意しておいて、これを読み込ませ、この条件でコネクタを引いてください、というのが、マクロの流れとなります。
0.事前に4項目(コネクタの元と先の図形番号とそれぞれのコネクタをつける場所。)のセットを作っておき、その場所を選択しておく。

1.パラメータを取得する
2.パラメータの内容に基づきコネクタを引く
1.は基本コマンドなので省略します。
コネクタ(カギ型です)を引くコマンドは次の通りです。
ActiveSheet.Shapes.AddConnector(msoConnectorElbow, 283.5, 405#, 7.5, 48# _
).Select
コネクタの先を矢印型にする
Selection.ShapeRange.Line.EndArrowheadStyle = msoArrowheadTriangle
線の太さ
Selection.ShapeRange.Line.Weight = 1.25
コネクタ開始の図形とその場所
Selection.ShapeRange.ConnectorFormat.BeginConnect ActiveSheet.Shapes(z_no1(i)), kone1(i)
Shapes(z_no1(i)) のカッコ内が図形の番号です
kone1(i) のカッコ内が結ぶ場所の番号です
コネクタ先の図形とその場所
Selection.ShapeRange.ConnectorFormat.EndConnect ActiveSheet.Shapes(z_no9(i)), kone9(i)
Shapes(z_no9(i)) のカッコ内が図形の番号です
kone9(i) のカッコ内が結ぶ場所の番号です
これを必要なだけ繰り返します。
このマクロのメリットは、机上で設計が出来、そのままパラメータとして与えられる点です。
一旦コネクタで結べば、もとの図形を動かしても大丈夫です。
それでは、コネクタを引きなおしたいというニーズに対してはどうするのでしょうか。
現在では、特定のコネクタを指定して、引き直すというやり方はとっていません。一旦削除(これはマクロ)して、改めて引き直すという方法をとっています。これはコネクタの図形番号がわかりにくいということによります。
具体的手順は次のようになります。
1.一旦引いた後、"図形のテキスト、名前等の取得・書き込み"(第65回目参照)で、コネクタ群の図形番号を把握します。
2.その番号を指定して、図形を削除します。(今後登場予定)
3.コネクタのパラメータを修正して、改めてコネクタを引きます。
今回までで、組織図とか流れ図などかなりの部分は作成可能となります(間違った場合はその部分を手で削除して作り直してください)。
エクセルシートを文書と見立てれば、ワード感覚の資料が出来ます。
次からは補助機能を紹介します。
1.今回話題になった削除(図形番号を指定。範囲指定も可とする)
2.図形のテキストに図形番号を付加するまたは図形番号を削除する
(図を見ただけで番号がわかるようにします。不要になれば消せます)
3.大きさの修正(倍率を指定。縦横同時のみならず、縦だけ、横だけも可とする)
4.直線を引く(水平、垂直線)
5.線、コネクタの線の太さ、矢印の向きの修正
6.図形に色をつける
7.コネクタを全部削除
もひとつおまけに、
8.図形の整列(図形群の横軸をそろえる、縦軸をそろえる、横に均等配置する、縦に均等配置する)
2007年12月15日土曜日
第66回目 図形編(その4) 図形の移動
○第66回目 図形編(その4) 図形の移動
まずはお遊びです。
一つの図形をカーソルのある場所に移動します。
Sub bb指定した一つの図形の移動()
'移動先のセルを指定してから実行
'図形の番号の事前確認が必要
Dim z_no
Dim AAA,AAA1,gyo1,retu1
On Error Resume Next
'指定範囲の取得
AAA = Selection.Address
'図形の移動
z_no = Val(InputBox("図形の番号を入力してください。 ", "1"))
ActiveSheet.Shapes(z_no).Left = Range(AAA).Left
ActiveSheet.Shapes(z_no).Top = Range(AAA).Top
Range(AAA).Select
End Sub
かなめはお分かりでしょうか。
ActiveSheet.Shapes(z_no).Left = Range(AAA).Left
ActiveSheet.Shapes(z_no).Top = Range(AAA).Top
の2行です。そしてこれを一般化すればいいことになります。
これをある程度システム化しなればなりません。それが本当の問題となります。
列番号で考えて、最後に列記号に変換するという流れとします。(行も考え方は同じです)
前提がいっぱいあるのですが、その一つは、図形を表示したい場所のセルは列の幅、行の高さは一定とするということです。セルにあわせて図形を置くことになるので納得いくと思います。(セルの幅8.3、セルの高さ13.5としました)
図形管理表を参照しながらお読みください。(端数の欄は気にしないでください)

【位置決めの手順】
1.左上端の基準セルを決めます。例として27列の6行目(AA6)とします。
2.一単位のセルの数を決め、基準のセルから何単位右に置くかを決めます。
3.図形の列を考えた時、何セルごとに並べれば重ならないか、間隔が適当かを決めます。1単位4列としました。同様に行数も決めます。1単位8行としました。
4.2の横に補助単位を入れます。これは基準単位の半分の列数とします。それに微調整としての数値を入れます。本単位を定めるの列、補助単位を定める列に数値(それぞれa1、a2とします)を入れます。
5.すると最終的な列番号は、27+a1*4+a2*2 となります。行数も、6+8*b1+4*b2 となります。同じ列に並べたいものは同じ数値を入れてください。
6.出来あがった列番号と行番号を用いて、A1形式の座標を作ります。列記号の変換の逆になりますので、列記号と列番号の対応を求める昔の記事を見てください(列記号と列番号の対応のために処理は、第26回参照)。
(この際に、番号から列記号の変換機能を関数にしました。エクセルシート上でも参照可能です)。
7.&関数で列記号と行番号をくっつけます。
8.これを、図形番号の横にあいている場所に張り付けます。式で持っていってもかまいません。いらないところはヌル("")にしてください。
9.図形番号と移動先セル座標を指定して、マクロを動かします。
図形の番号と移動先のセルの番号がわかりましたので、一個のときと同じことを何回か繰り返せばいいことになります。
列の位置、行の位置を決めるための位置単位の基準値は変更することがありますので外からあてがっておいてください。
これは連続している任意の個数を動かすことが出来ます。もちろん1個でも可能です。
マクロを動かすと面白いように意図したところに整列します。当たり前ですが…。
でも最初に動いた時は、感動しました。こういう感動を大切にしましょう。
まずはお遊びです。
一つの図形をカーソルのある場所に移動します。
Sub bb指定した一つの図形の移動()
'移動先のセルを指定してから実行
'図形の番号の事前確認が必要
Dim z_no
Dim AAA,AAA1,gyo1,retu1
On Error Resume Next
'指定範囲の取得
AAA = Selection.Address
'図形の移動
z_no = Val(InputBox("図形の番号を入力してください。 ", "1"))
ActiveSheet.Shapes(z_no).Left = Range(AAA).Left
ActiveSheet.Shapes(z_no).Top = Range(AAA).Top
Range(AAA).Select
End Sub
かなめはお分かりでしょうか。
ActiveSheet.Shapes(z_no).Left = Range(AAA).Left
ActiveSheet.Shapes(z_no).Top = Range(AAA).Top
の2行です。そしてこれを一般化すればいいことになります。
これをある程度システム化しなればなりません。それが本当の問題となります。
列番号で考えて、最後に列記号に変換するという流れとします。(行も考え方は同じです)
前提がいっぱいあるのですが、その一つは、図形を表示したい場所のセルは列の幅、行の高さは一定とするということです。セルにあわせて図形を置くことになるので納得いくと思います。(セルの幅8.3、セルの高さ13.5としました)
図形管理表を参照しながらお読みください。(端数の欄は気にしないでください)

【位置決めの手順】
1.左上端の基準セルを決めます。例として27列の6行目(AA6)とします。
2.一単位のセルの数を決め、基準のセルから何単位右に置くかを決めます。
3.図形の列を考えた時、何セルごとに並べれば重ならないか、間隔が適当かを決めます。1単位4列としました。同様に行数も決めます。1単位8行としました。
4.2の横に補助単位を入れます。これは基準単位の半分の列数とします。それに微調整としての数値を入れます。本単位を定めるの列、補助単位を定める列に数値(それぞれa1、a2とします)を入れます。
5.すると最終的な列番号は、27+a1*4+a2*2 となります。行数も、6+8*b1+4*b2 となります。同じ列に並べたいものは同じ数値を入れてください。
6.出来あがった列番号と行番号を用いて、A1形式の座標を作ります。列記号の変換の逆になりますので、列記号と列番号の対応を求める昔の記事を見てください(列記号と列番号の対応のために処理は、第26回参照)。
(この際に、番号から列記号の変換機能を関数にしました。エクセルシート上でも参照可能です)。
7.&関数で列記号と行番号をくっつけます。
8.これを、図形番号の横にあいている場所に張り付けます。式で持っていってもかまいません。いらないところはヌル("")にしてください。
9.図形番号と移動先セル座標を指定して、マクロを動かします。
図形の番号と移動先のセルの番号がわかりましたので、一個のときと同じことを何回か繰り返せばいいことになります。
列の位置、行の位置を決めるための位置単位の基準値は変更することがありますので外からあてがっておいてください。
これは連続している任意の個数を動かすことが出来ます。もちろん1個でも可能です。
マクロを動かすと面白いように意図したところに整列します。当たり前ですが…。
でも最初に動いた時は、感動しました。こういう感動を大切にしましょう。
2007年12月10日月曜日
第65回目 図形編(その3) 図形のテキスト、名前等の取得・書き込みから修正
○第65回目 図形編(その3) 図形のテキスト、名前等の取得・書き込みから修正
今回は、作成した図形のテキスト、名前等を取得し、セルに表示します。
手作業による、削除があるので、番号が崩れてしまいますので、現在の図形の状態を表示するものです。
表示項目は、図形の番号、テキスト、図形の名前(この中に種類が含まれる)です。後のために、図形の番号、スペース(位置座標用)、テキスト、図形の名前の4項目を表示します。
実行前に、貼付ける位置の先頭にカーソルをおいてください。
まずはセルの位置を取得してください。
次に、図形の数は、ii9 = ActiveSheet.Shapes.Count となります。
図形のテキストと名前は、Selection.Characters.Textと Selection.Nameとなります。
テキスト、名前の取得は次のようになります
ActiveSheet.Shapes(i).Select
mm1(i) = Selection.Characters.Text
mm2(i) = Selection.Name
これでほとんどおしまいなのです。
あとは、図形の番号、テキスト、図形の名前を指定された場所に貼り付けるだけです。
ほとんどロジックがないので簡単です。
cells(gyou1,retu1)から貼り付けていきます。二列目は、座標用なので飛ばして貼り付けてください。
Cells(gyo1 + i, retu1) = i
Cells(gyo1 + i, retu1 + 2) = mm1(i)
Cells(gyo1 + i, retu1 + 3) = mm2(i)
といった具合です。
図形の管理用の表を同時に作っておきます。イメージは下の画像のとおりです。
【図形管理表のイメージ】

テキストの内容を修正するにはどうしたらよいでしょうか。セルに書き込んだテキストを修正します。そして、図形の番号と共にテキストを指定して修正をかけます。
三列N行を指定することになります。指定してから実行してください。
マクロは、指定範囲座標の取得から、内容の格納となります。1列、空列がありますので気をつけてください。変数はnn(i)、mm1(i)にいれておいてください。
図形の番号をnn(i)で指定して、mm1(i)でテキストを置き換えます。
大事な部分を抜き出すと、
j = nn(i)
ActiveSheet.Shapes(j).Select
Selection.Characters.Text = mm1(i)
となります。
1行目と2行目以降を合体されても結構です。
ActiveSheet.Shapes(nn(i)).Select
Selection.Characters.Text = mm1(i)
ですから、図形の管理表を直して、直した箇所を指定してマクロを動かす。ということになります。修正の必要のないものも、同じもので直すと考えれば、最初から最後の図形のテキストまで指定してもいいことになります。
こんなに簡単だったんですね。手作業で行なうのとは比べ物になりません。
前にも言いましたが、どこからかテキストの内容を持ってきて、エクセルのセルに貼付け、図形を作成するということが簡単に出来てしまいのです。修正も簡単ですね。
次は図形の移動です。
これも準備(座標の決めと入力)に比べたらマクロは非常に簡単です。
本当に好きなところに移動します。面白いですよ。
今回は、作成した図形のテキスト、名前等を取得し、セルに表示します。
手作業による、削除があるので、番号が崩れてしまいますので、現在の図形の状態を表示するものです。
表示項目は、図形の番号、テキスト、図形の名前(この中に種類が含まれる)です。後のために、図形の番号、スペース(位置座標用)、テキスト、図形の名前の4項目を表示します。
実行前に、貼付ける位置の先頭にカーソルをおいてください。
まずはセルの位置を取得してください。
次に、図形の数は、ii9 = ActiveSheet.Shapes.Count となります。
図形のテキストと名前は、Selection.Characters.Textと Selection.Nameとなります。
テキスト、名前の取得は次のようになります
ActiveSheet.Shapes(i).Select
mm1(i) = Selection.Characters.Text
mm2(i) = Selection.Name
これでほとんどおしまいなのです。
あとは、図形の番号、テキスト、図形の名前を指定された場所に貼り付けるだけです。
ほとんどロジックがないので簡単です。
cells(gyou1,retu1)から貼り付けていきます。二列目は、座標用なので飛ばして貼り付けてください。
Cells(gyo1 + i, retu1) = i
Cells(gyo1 + i, retu1 + 2) = mm1(i)
Cells(gyo1 + i, retu1 + 3) = mm2(i)
といった具合です。
図形の管理用の表を同時に作っておきます。イメージは下の画像のとおりです。
【図形管理表のイメージ】

テキストの内容を修正するにはどうしたらよいでしょうか。セルに書き込んだテキストを修正します。そして、図形の番号と共にテキストを指定して修正をかけます。
三列N行を指定することになります。指定してから実行してください。
マクロは、指定範囲座標の取得から、内容の格納となります。1列、空列がありますので気をつけてください。変数はnn(i)、mm1(i)にいれておいてください。
図形の番号をnn(i)で指定して、mm1(i)でテキストを置き換えます。
大事な部分を抜き出すと、
j = nn(i)
ActiveSheet.Shapes(j).Select
Selection.Characters.Text = mm1(i)
となります。
1行目と2行目以降を合体されても結構です。
ActiveSheet.Shapes(nn(i)).Select
Selection.Characters.Text = mm1(i)
ですから、図形の管理表を直して、直した箇所を指定してマクロを動かす。ということになります。修正の必要のないものも、同じもので直すと考えれば、最初から最後の図形のテキストまで指定してもいいことになります。
こんなに簡単だったんですね。手作業で行なうのとは比べ物になりません。
前にも言いましたが、どこからかテキストの内容を持ってきて、エクセルのセルに貼付け、図形を作成するということが簡単に出来てしまいのです。修正も簡単ですね。
次は図形の移動です。
これも準備(座標の決めと入力)に比べたらマクロは非常に簡単です。
本当に好きなところに移動します。面白いですよ。
2007年12月1日土曜日
第64回目 図形編(その2) 図形の一括作成
○第64回目 図形編(その2) 図形の一括作成
最初は図形の一括作成です。図形の選択はマクロの中で行ないます。実行前処理としては、書き込みたいテキストを選択することになります。
セルにテキストの内容を書いてその範囲を指定します。
この部分をセルの範囲座標の取得と内容の取得という基本的な機能で処理します。
また、追加でもいいことになるので、既存の図形の数も取っておきます。=⇒新規作成だけでなく追加機能も含んでいます。
図形の数は最大100としましたので、テキストの数も100とします。 Dim mm1(100)
テキストはエディタなどで作成しておいて、エクセルに貼り付けるのも一法です。
すでにエディタで整理してある文言を利用することにすると、手間が省けます。
図形の数は、 ii9 = ActiveSheet.Shapes.Count となります。
(コマンドが限られているので、ロジックが少なく意外と簡単なのです)
次は図形の選択です。
z_form = InputBox("図形の種類を入力してください。1…面取り長方形、2…楕円、3…爆発、4…噴出し、 ", , "1") としました。図形の種類は一回の処理ではひとつのみです。
これをもとに、作りたい図形の数だけ繰り返します。作成する図形の数は、有効行数なのでgyo_cntとなっています。
図形は、番号で管理します。
図形の作成は、Case文で分岐させています。
Select Case z_form
Case "1"
ActiveSheet.Shapes.AddShape(msoShapeRoundedRectangle, 225.75, 822.75, 126#, 62.25).Select
Case "2"
:
Case Else
Exit Sub
End Select
となります。面取り長方形の場合です。
楕円の場合=⇒ ActiveSheet.Shapes.AddShape(msoShapeOval, (略))
爆発の場合=⇒ ActiveActiveSheet.Shapes.AddShape(msoShapeExplosion2, (略))
噴出しの場合=⇒ ActiveActiveSheet.Shapes.AddShape(msoShapeOvalCallout, (略))
テキストを入れます。
Selection.Characters.Text = mm1(i)
次に表示位置を決めます。この段階では、暫定的なので、あるセルを指定して、そこから斜めに展開しています。
ここでは図形の番号、位置の設定が出てきます。
位置は、簡単なようにセルの上と左にあわせるという形をとります。
まずは貼り付ける位置を設定します。
Dim セル範囲 As Range
Set セル範囲 = Application.InputBox(Prompt:="図形を並べる基準のセルを指定してください", Default:=AAA1, Left:=10, Top:=2, Type:=8)
aaa2 = セル範囲.Address
retu2 = Range(aaa2).Column
gyo2 = Range(aaa2).Row
位置は、
ActiveSheet.Shapes(j).Left = Cells(gyo2 + (i - 1) * 3, retu2 + i - 1).Left
ActiveSheet.Shapes(j).Top = Cells(gyo2 + (i - 1) * 3, retu2 + i - 1).Top
で指定します。一列右、三行下に図形が次々に移動します。(早くて見えませんけどね)
このでの"j"が図形の番号です。追加の場合もありますので、
j = ii9 + i 'ii9が既存の図形の個数
あとで出てきますが、図形に色をつける必要があります。その色見本を作ることが可能です。
連番を入れておき、それ番号に対応する色つけるという処理を一緒にするのです。
私を含めて、色のことをそれほど知らない人にとっては、あっと思うこと請け合いです。
'特別処理;色を付ける;色見本用
For i = 1 To gyo_cnt
ActiveSheet.Shapes(i).Select
Selection.ShapeRange.Fill.ForeColor.SchemeColor = i
' SchemeColor = 51 '橙、10 '赤、13 '黄色、11 '黄緑、9 '白
Next i
※コマンドを探すのに苦労した割には、単純なマクロです。
今回のマクロでこれからのマクロの原型の機能がほとんど出ています。
これは大丈夫なのですが、図形の場合はよくエラーが出ますので、処理内容がチェックできたら、先頭に、 On Error Resume Next をいれて、エラーを回避するのも一法です。(共通注意事項。致命的なエラーの場合ははずして原因を突き止めてください)
最初は図形の一括作成です。図形の選択はマクロの中で行ないます。実行前処理としては、書き込みたいテキストを選択することになります。
セルにテキストの内容を書いてその範囲を指定します。
この部分をセルの範囲座標の取得と内容の取得という基本的な機能で処理します。
また、追加でもいいことになるので、既存の図形の数も取っておきます。=⇒新規作成だけでなく追加機能も含んでいます。
図形の数は最大100としましたので、テキストの数も100とします。 Dim mm1(100)
テキストはエディタなどで作成しておいて、エクセルに貼り付けるのも一法です。
すでにエディタで整理してある文言を利用することにすると、手間が省けます。
図形の数は、 ii9 = ActiveSheet.Shapes.Count となります。
(コマンドが限られているので、ロジックが少なく意外と簡単なのです)
次は図形の選択です。
z_form = InputBox("図形の種類を入力してください。1…面取り長方形、2…楕円、3…爆発、4…噴出し、 ", , "1") としました。図形の種類は一回の処理ではひとつのみです。
これをもとに、作りたい図形の数だけ繰り返します。作成する図形の数は、有効行数なのでgyo_cntとなっています。
図形は、番号で管理します。
図形の作成は、Case文で分岐させています。
Select Case z_form
Case "1"
ActiveSheet.Shapes.AddShape(msoShapeRoundedRectangle, 225.75, 822.75, 126#, 62.25).Select
Case "2"
:
Case Else
Exit Sub
End Select
となります。面取り長方形の場合です。
楕円の場合=⇒ ActiveSheet.Shapes.AddShape(msoShapeOval, (略))
爆発の場合=⇒ ActiveActiveSheet.Shapes.AddShape(msoShapeExplosion2, (略))
噴出しの場合=⇒ ActiveActiveSheet.Shapes.AddShape(msoShapeOvalCallout, (略))
テキストを入れます。
Selection.Characters.Text = mm1(i)
次に表示位置を決めます。この段階では、暫定的なので、あるセルを指定して、そこから斜めに展開しています。
ここでは図形の番号、位置の設定が出てきます。
位置は、簡単なようにセルの上と左にあわせるという形をとります。
まずは貼り付ける位置を設定します。
Dim セル範囲 As Range
Set セル範囲 = Application.InputBox(Prompt:="図形を並べる基準のセルを指定してください", Default:=AAA1, Left:=10, Top:=2, Type:=8)
aaa2 = セル範囲.Address
retu2 = Range(aaa2).Column
gyo2 = Range(aaa2).Row
位置は、
ActiveSheet.Shapes(j).Left = Cells(gyo2 + (i - 1) * 3, retu2 + i - 1).Left
ActiveSheet.Shapes(j).Top = Cells(gyo2 + (i - 1) * 3, retu2 + i - 1).Top
で指定します。一列右、三行下に図形が次々に移動します。(早くて見えませんけどね)
このでの"j"が図形の番号です。追加の場合もありますので、
j = ii9 + i 'ii9が既存の図形の個数
あとで出てきますが、図形に色をつける必要があります。その色見本を作ることが可能です。
連番を入れておき、それ番号に対応する色つけるという処理を一緒にするのです。
私を含めて、色のことをそれほど知らない人にとっては、あっと思うこと請け合いです。
'特別処理;色を付ける;色見本用
For i = 1 To gyo_cnt
ActiveSheet.Shapes(i).Select
Selection.ShapeRange.Fill.ForeColor.SchemeColor = i
' SchemeColor = 51 '橙、10 '赤、13 '黄色、11 '黄緑、9 '白
Next i
※コマンドを探すのに苦労した割には、単純なマクロです。
今回のマクロでこれからのマクロの原型の機能がほとんど出ています。
これは大丈夫なのですが、図形の場合はよくエラーが出ますので、処理内容がチェックできたら、先頭に、 On Error Resume Next をいれて、エラーを回避するのも一法です。(共通注意事項。致命的なエラーの場合ははずして原因を突き止めてください)
2007年11月28日水曜日
第63回目 図形編(その1) どこまで利用価値があるのが作れるか
○第63回目 図形編(その1) どこまで利用価値があるのが作れるか
まずはニーズの洗い出しです。
図形を使って何かやった例を思い起こしてください。ワードも含めて考えると、資料のある一部に、ふき出し等で注記を加えるときに使用するということが多いのではないでしょうか。(図形で近くの地図を書くとかいうかなり趣味的なものは除きます)
他にも、
フローチャートを作る。
業務の流れを図式化する。
あるものの構造を図式化する。(一例として組織図がイメージしやすい)
パソコンの月刊誌二誌を見て気がついてもの。
案内地図、組織図、作業手順、大まかなフローチャート、家系図、説明書きの見出し、必要な手続きの流れ、機能(三つか四つ)の全体像、説明書き(かなりの複数行)、図形に画像をはめ込みイメージアップ、講評、図の重ね合わせで複雑な表現、
図形として使うか、コメントを強調するために使うか、に二分されます。
後者の中でも、単純なものもあれば、図を重ねて複雑な表現をしているのがありました。
マクロですので基本のうち70%ぐらいで十分ですが、後は面白いといったものも対象にしたいですね。
当面考えないもの(複雑なものは当然考えません)。
色、重ね合わせの図の順番、大きさ、線の太さ。
【取り上げる機能】
※ある種の図形のみとする(面取り長方形、噴出し、爆発)
1.図形の新規作成。図中にコメントを入れる。
2.図形の追加(図形の種類として線も対象)
3.図形の削除
4.コメントの修正
5.コネクタで結ぶ
6.図形の移動(複雑。複数、座標を与える)
7.図形の移動(単純。一つの図形のみ、カーソルの位置に移動)
※上記例のうち、"案内地図"、"家系図"、"図形に画像をはめ込みイメージアップ"は対象外としています。
※作成はエクセル2007のものとなります。
まずはニーズの洗い出しです。
図形を使って何かやった例を思い起こしてください。ワードも含めて考えると、資料のある一部に、ふき出し等で注記を加えるときに使用するということが多いのではないでしょうか。(図形で近くの地図を書くとかいうかなり趣味的なものは除きます)
他にも、
フローチャートを作る。
業務の流れを図式化する。
あるものの構造を図式化する。(一例として組織図がイメージしやすい)
パソコンの月刊誌二誌を見て気がついてもの。
案内地図、組織図、作業手順、大まかなフローチャート、家系図、説明書きの見出し、必要な手続きの流れ、機能(三つか四つ)の全体像、説明書き(かなりの複数行)、図形に画像をはめ込みイメージアップ、講評、図の重ね合わせで複雑な表現、
図形として使うか、コメントを強調するために使うか、に二分されます。
後者の中でも、単純なものもあれば、図を重ねて複雑な表現をしているのがありました。
マクロですので基本のうち70%ぐらいで十分ですが、後は面白いといったものも対象にしたいですね。
当面考えないもの(複雑なものは当然考えません)。
色、重ね合わせの図の順番、大きさ、線の太さ。
【取り上げる機能】
※ある種の図形のみとする(面取り長方形、噴出し、爆発)
1.図形の新規作成。図中にコメントを入れる。
2.図形の追加(図形の種類として線も対象)
3.図形の削除
4.コメントの修正
5.コネクタで結ぶ
6.図形の移動(複雑。複数、座標を与える)
7.図形の移動(単純。一つの図形のみ、カーソルの位置に移動)
※上記例のうち、"案内地図"、"家系図"、"図形に画像をはめ込みイメージアップ"は対象外としています。
※作成はエクセル2007のものとなります。
2007年11月24日土曜日
第62回目 これまでのマクロの全体像
○第62回目 これまでのマクロの全体像
前回、マクロのかなりの部分を一覧表的に整理しました。
いい機会ですので、ほかのも含めての全体像を整理してみましょう。
------------------------------------------------------
事務屋のマクロで紹介したマクロ一覧表(第62回現在)
------------------------------------------------------
単 独;【コピー関係】
1.計算式のみコピー(シートの指定は不可)
2.数値のみコピー(シートの指定は不可)
メイン;【コピー関係】
サブ;
1.計算式のみコピー(シートの指定も可)
2.数値のみコピー(シートの指定も可)
3.シート内で複数回のコピー(コピー先が複数に渡って規則正しい場合)
4.シート外の複数回コピー(コピー先が複数シートに渡って場所が同じ場合)
メイン;【セルの結合関係】
サブ;
1.セルの結合
2.セルの結合の解除
メイン;【罫線作成】
サブ;
1.全部引く
2.五飛びに横罫線を引く(飛びは指定可)
3.細線の横罫線を引く
4.全部消す
5.罫線ダイアログの表示
メイン;【印刷作成】
サブ;
1.一気にシート印刷(ダイアログの表示を省略)
2.指定範囲の印刷(設定した改行マークをまたいで指定するとページが分かれる点を、改善すべき)
3.ページ指定の印刷(シート内。カラープリンタの設定も可能)
4.複数シートの印刷(現在のシートから複数シート設定。カラープリンタの設定も可能))
5.自分好みのヘッダ・フッタのセット
6.印刷ダイアログの表示
メイン;【ジャンプ関係】
サブ;
1.シート内にジャンプ(セルを指定)
2.シート外にジャンプ(セルも指定可)
メイン;【計算式文字化関係】
サブ;
1.計算式を文字に(頭に特殊文字列を付加)
2.文字を計算式に(頭の特殊文字列を削除)
3.計算式を文字にしてデータのみの貼り付け
メイン;【小技マクロ】
サブ;
1.連番入力(範囲内に連番を作成)
2.複数文字列の置き換え
3.シート名の取得(ファイル内の全シート名を取得)
4.数式セル保護
5.端にヌル式セット
6.端にsum関数セット
7.指定範囲の座標を貼り付け(範囲を指定したA1形式の座標を貼り付ける)
8.列記号の生み出し(連続する列記号を作成)
9.セルの階段状挿入
メイン;【小技^2】
サブ;
1.指定範囲の数値のみを100倍
2.指定範囲の数値のみを1/100
3.指定範囲の数値のみをクリア
4.指定範囲の特定文字列を含むセルのクリア
メイン;【グラフ作成】
サブ;
1.グラフ新規作成(一括作成)
2.グラフからデータ系列の取得(表示も含む)
3.グラフの追加(ワークシートからのデータ系列の取得を含む)
4.グラフデータ範囲の修正(ワークシートからのデータ系列の取得を含む)
5.グラフタイトル等の修正(ワークシートからのタイトル等の取得を含む)
メイン;【ファイルの仕様書作成(専用のワークシートを作成して実行)】
サブ;
1.シート名の取得とリンクの貼付け
2.シート名の横にコメントを貼る
3.アウトライン用セルの挿入
4.各セルの内容を結合(列単位で複数行のセル内容を結合する)
5.各シートにコメントを貼付け
メイン;【チェック表の作成】
サブ;
1.一つ前の行からの増減率・増減値のチェック表を作る
2.二つの表の増減率・増減値のチェック表を作る
3.詳細な表の概略版を作る(ここに整理するのはどうかな…)
メイン;【複雑系計算式の作成】
サブ;
1.複雑_複雑系計算式の作成(バージョンアップ版、作成中)
2.複雑系計算式の作成
【Function】
1.数値からそれに対応する列記号を生み出す
2.数値のみを文字化する
【フリーソフトからのもの】
列幅拡大
列幅縮小
行高さアップ
行高さダウン
セル書式数字増やす・減らす(小数点以下の表示桁数の調整)
左中右寄せ
上中下寄せ
フォントアップ・ダウン
前回、マクロのかなりの部分を一覧表的に整理しました。
いい機会ですので、ほかのも含めての全体像を整理してみましょう。
------------------------------------------------------
事務屋のマクロで紹介したマクロ一覧表(第62回現在)
------------------------------------------------------
単 独;【コピー関係】
1.計算式のみコピー(シートの指定は不可)
2.数値のみコピー(シートの指定は不可)
メイン;【コピー関係】
サブ;
1.計算式のみコピー(シートの指定も可)
2.数値のみコピー(シートの指定も可)
3.シート内で複数回のコピー(コピー先が複数に渡って規則正しい場合)
4.シート外の複数回コピー(コピー先が複数シートに渡って場所が同じ場合)
メイン;【セルの結合関係】
サブ;
1.セルの結合
2.セルの結合の解除
メイン;【罫線作成】
サブ;
1.全部引く
2.五飛びに横罫線を引く(飛びは指定可)
3.細線の横罫線を引く
4.全部消す
5.罫線ダイアログの表示
メイン;【印刷作成】
サブ;
1.一気にシート印刷(ダイアログの表示を省略)
2.指定範囲の印刷(設定した改行マークをまたいで指定するとページが分かれる点を、改善すべき)
3.ページ指定の印刷(シート内。カラープリンタの設定も可能)
4.複数シートの印刷(現在のシートから複数シート設定。カラープリンタの設定も可能))
5.自分好みのヘッダ・フッタのセット
6.印刷ダイアログの表示
メイン;【ジャンプ関係】
サブ;
1.シート内にジャンプ(セルを指定)
2.シート外にジャンプ(セルも指定可)
メイン;【計算式文字化関係】
サブ;
1.計算式を文字に(頭に特殊文字列を付加)
2.文字を計算式に(頭の特殊文字列を削除)
3.計算式を文字にしてデータのみの貼り付け
メイン;【小技マクロ】
サブ;
1.連番入力(範囲内に連番を作成)
2.複数文字列の置き換え
3.シート名の取得(ファイル内の全シート名を取得)
4.数式セル保護
5.端にヌル式セット
6.端にsum関数セット
7.指定範囲の座標を貼り付け(範囲を指定したA1形式の座標を貼り付ける)
8.列記号の生み出し(連続する列記号を作成)
9.セルの階段状挿入
メイン;【小技^2】
サブ;
1.指定範囲の数値のみを100倍
2.指定範囲の数値のみを1/100
3.指定範囲の数値のみをクリア
4.指定範囲の特定文字列を含むセルのクリア
メイン;【グラフ作成】
サブ;
1.グラフ新規作成(一括作成)
2.グラフからデータ系列の取得(表示も含む)
3.グラフの追加(ワークシートからのデータ系列の取得を含む)
4.グラフデータ範囲の修正(ワークシートからのデータ系列の取得を含む)
5.グラフタイトル等の修正(ワークシートからのタイトル等の取得を含む)
メイン;【ファイルの仕様書作成(専用のワークシートを作成して実行)】
サブ;
1.シート名の取得とリンクの貼付け
2.シート名の横にコメントを貼る
3.アウトライン用セルの挿入
4.各セルの内容を結合(列単位で複数行のセル内容を結合する)
5.各シートにコメントを貼付け
メイン;【チェック表の作成】
サブ;
1.一つ前の行からの増減率・増減値のチェック表を作る
2.二つの表の増減率・増減値のチェック表を作る
3.詳細な表の概略版を作る(ここに整理するのはどうかな…)
メイン;【複雑系計算式の作成】
サブ;
1.複雑_複雑系計算式の作成(バージョンアップ版、作成中)
2.複雑系計算式の作成
【Function】
1.数値からそれに対応する列記号を生み出す
2.数値のみを文字化する
【フリーソフトからのもの】
列幅拡大
列幅縮小
行高さアップ
行高さダウン
セル書式数字増やす・減らす(小数点以下の表示桁数の調整)
左中右寄せ
上中下寄せ
フォントアップ・ダウン
2007年11月22日木曜日
第61回目 グラフ関係の図式的な整理、あわせてちょっとした小物編の整理
○第61回目 グラフ関係の図式的な整理、あわせてちょっとした小物編の整理
グラフ関係のマクロの整理をしましょう。
グラフ管理表は次のようになっています。

グラフ関係のマクロはサブルーティン化されて次のようになっています。
メイン;グラフ作成
サブ;
1.グラフ新規作成(一括作成)
2.グラフからデータ系列の取得(表示も含む)
3.グラフの追加(ワークシートからのデータ系列の取得から)
4.グラフデータ範囲の修正(ワークシートからのデータ系列の取得から)
5.グラフタイトル等の修正(ワークシートからのタイトル等の取得から)
となっています。
このシステムは、2を中心に動きます。これによりワークシート上に、既存のグラフのデータ系列が表示されるからです。これを加工したあと、グラフに反映させるのは、4.となります。
また、このデータ系列をもとにして、新たなデータセットを作って、グラフに追加するのは、3.となります。
グラフを管理するワークシートを作るとスムーズにいきます。2.のデータ系列の取得・表示も、貼りつけるセルを指定(シートの移動と同じコマンドを使う)するようにしましたので、任意性も出てきました。
グラフの順番を変えるのも、データ系列をソートして、その結果を4.でグラフに返してやれば、意図した順番になります。(他のグラフでの表示とあわせるためなど)
作業してみて、どこのセルを指定したらいいのかの指示があるといいと思って、そのセルを色付けしました。また、見出しも作っていますので、わかりやすくなっています。
管理表は、一括新規作成用のエリア、タイトル修正用のエリア、データ系列のエリア(20系列ほど確保)となっています。また、表札名(凡例に表示されるもの)も、データ系列にあわせて表示することにしました。
どんどんわかりやすくなっています。
後は図形(オートシェイプ)の研究をして、コメントを追加することでしょうか。位置の問題があるので、大体の場所を指定するができることを考えています。
同様に"ちょっとした小物編"で取り上げたものを整理しました。
なお、最後の小技関係は取り上げていないものも含めています。
メイン;印刷作成
サブ;
1.一気にシート印刷(ダイアログの表示を省略)
=⇒ほとんど使用価値なし。Ctrl+p、Enterのほうが早い。
2.指定範囲の印刷(設定した改行マークをまたいで指定するとページが分かれる点を、改善すべき)
3.ページ指定の印刷(シート内。カラープリンタの設定も可能)
4.複数シートの印刷(現在のシートから複数シート設定。カラープリンタの設定も可能))
5.自分好みのヘッダ・フッタのセット
6.印刷ダイアログの表示
メイン;罫線作成
サブ;
1.全部引く
2.五飛びに横罫線を引く(飛びは指定可)
3.細線の横罫線を引く
4.全部消す
5.罫線ダイアログの表示
メイン;ジャンプ関係
サブ;
1.シート内にジャンプ(セルを指定)
2.シート外にジャンプ(セルも指定可)
単 独;コピー関係
1.計算式のみコピー(シートの指定は不可)
2.数値のみコピー(シートの指定は不可)
メイン;コピー関係
サブ;
1.計算式のみコピー(シートの指定も可)
2.数値のみコピー(シートの指定も可)
3.シート内で複数回のコピー(コピー先が複数に渡って規則正しい場合)
4.シート外の複数回コピー(コピー先が複数シートに渡って場所が同じ場合)
メイン;計算式文字化関係
サブ;
1.計算式を文字に(頭に特殊文字列を付加)
2.文字を計算式に(頭の特殊文字列を削除)
3.計算式を文字にしてデータのみの貼り付け
メイン;セルの結合関係
サブ;
1.セルの結合
2.セルの結合の解除
メイン;小技マクロ
サブ;
1.連番入力(範囲内に連番を作成)
2.複数文字列の置き換え
3.シート名の取得(ファイル内の全シート名を取得)
4.数式セル保護
5.端にヌル式セット
6.端にsum関数セット
7.指定範囲の座標を貼り付け(範囲を指定したA1形式の座標を貼り付ける)
8.列記号の生み出し(連続する列記号を作成)
9.セルの階段状挿入
メイン;小技^2
サブ;
1.指定範囲の数値のみを100倍
2.指定範囲の数値のみを1/100
3.指定範囲の数値のみをクリア
4.指定範囲の特定文字列を含むセルのクリア
グラフ関係のマクロの整理をしましょう。
グラフ管理表は次のようになっています。

グラフ関係のマクロはサブルーティン化されて次のようになっています。
メイン;グラフ作成
サブ;
1.グラフ新規作成(一括作成)
2.グラフからデータ系列の取得(表示も含む)
3.グラフの追加(ワークシートからのデータ系列の取得から)
4.グラフデータ範囲の修正(ワークシートからのデータ系列の取得から)
5.グラフタイトル等の修正(ワークシートからのタイトル等の取得から)
となっています。
このシステムは、2を中心に動きます。これによりワークシート上に、既存のグラフのデータ系列が表示されるからです。これを加工したあと、グラフに反映させるのは、4.となります。
また、このデータ系列をもとにして、新たなデータセットを作って、グラフに追加するのは、3.となります。
グラフを管理するワークシートを作るとスムーズにいきます。2.のデータ系列の取得・表示も、貼りつけるセルを指定(シートの移動と同じコマンドを使う)するようにしましたので、任意性も出てきました。
グラフの順番を変えるのも、データ系列をソートして、その結果を4.でグラフに返してやれば、意図した順番になります。(他のグラフでの表示とあわせるためなど)
作業してみて、どこのセルを指定したらいいのかの指示があるといいと思って、そのセルを色付けしました。また、見出しも作っていますので、わかりやすくなっています。
管理表は、一括新規作成用のエリア、タイトル修正用のエリア、データ系列のエリア(20系列ほど確保)となっています。また、表札名(凡例に表示されるもの)も、データ系列にあわせて表示することにしました。
どんどんわかりやすくなっています。
後は図形(オートシェイプ)の研究をして、コメントを追加することでしょうか。位置の問題があるので、大体の場所を指定するができることを考えています。
同様に"ちょっとした小物編"で取り上げたものを整理しました。
なお、最後の小技関係は取り上げていないものも含めています。
メイン;印刷作成
サブ;
1.一気にシート印刷(ダイアログの表示を省略)
=⇒ほとんど使用価値なし。Ctrl+p、Enterのほうが早い。
2.指定範囲の印刷(設定した改行マークをまたいで指定するとページが分かれる点を、改善すべき)
3.ページ指定の印刷(シート内。カラープリンタの設定も可能)
4.複数シートの印刷(現在のシートから複数シート設定。カラープリンタの設定も可能))
5.自分好みのヘッダ・フッタのセット
6.印刷ダイアログの表示
メイン;罫線作成
サブ;
1.全部引く
2.五飛びに横罫線を引く(飛びは指定可)
3.細線の横罫線を引く
4.全部消す
5.罫線ダイアログの表示
メイン;ジャンプ関係
サブ;
1.シート内にジャンプ(セルを指定)
2.シート外にジャンプ(セルも指定可)
単 独;コピー関係
1.計算式のみコピー(シートの指定は不可)
2.数値のみコピー(シートの指定は不可)
メイン;コピー関係
サブ;
1.計算式のみコピー(シートの指定も可)
2.数値のみコピー(シートの指定も可)
3.シート内で複数回のコピー(コピー先が複数に渡って規則正しい場合)
4.シート外の複数回コピー(コピー先が複数シートに渡って場所が同じ場合)
メイン;計算式文字化関係
サブ;
1.計算式を文字に(頭に特殊文字列を付加)
2.文字を計算式に(頭の特殊文字列を削除)
3.計算式を文字にしてデータのみの貼り付け
メイン;セルの結合関係
サブ;
1.セルの結合
2.セルの結合の解除
メイン;小技マクロ
サブ;
1.連番入力(範囲内に連番を作成)
2.複数文字列の置き換え
3.シート名の取得(ファイル内の全シート名を取得)
4.数式セル保護
5.端にヌル式セット
6.端にsum関数セット
7.指定範囲の座標を貼り付け(範囲を指定したA1形式の座標を貼り付ける)
8.列記号の生み出し(連続する列記号を作成)
9.セルの階段状挿入
メイン;小技^2
サブ;
1.指定範囲の数値のみを100倍
2.指定範囲の数値のみを1/100
3.指定範囲の数値のみをクリア
4.指定範囲の特定文字列を含むセルのクリア
2007年11月17日土曜日
第60回目 グラフ関係(その6;グラフのタイトル等を修正する及びまとめ)
○第60回目 グラフ関係(その6;グラフのタイトル等を修正する及びまとめ)
ここで修正の対象となるのは、タイトル、最小値、最大値、目盛りの間隔、目盛りの表示桁数(これだけは文字で与えてください)です。
考え方も簡単になります。すべてが既存のものの利用となります。
流れは、
0.ワークシートでタイトル等を入力する
1.ワークシートのタイトル等を取得する
2.グラフシートへの移動
3.タイトル等の修正
1.での最初にセットするカーソルの位置は、タイトルが記入されているセルです。そのセルから下に最小値等を記入しておいてください。
セル座標の取得からセルの値の取得ですので、今まで何回もやってきたものです。
2.シートの移動も何回か出てきました。直前にも出てきています。
3.タイトル等の修正は、タイトル等を保管している特殊な場所に、取得した値を入れればいいのです。
その部分は、
'タイトルの修正
ActiveChart.ChartTitle.Text = g_title
'目盛等の修正
ActiveChart.Axes(xlValue).MinimumScale = y_min
ActiveChart.Axes(xlValue).MaximumScale = y_max
ActiveChart.Axes(xlValue).MajorUnit = y_memori
ActiveChart.Axes(xlValue).TickLabels.NumberFormatLocal = y_keta
となります。(第41回"緊急講座グラフ編"の後半のところからの抜き出しです)
ということで、何の苦もなくできてしまいました。
グラフの線を太くするのは、
ActiveChart.SeriesCollection(i).Select
With Selection.Border
.ColorIndex = 57 'この記述は不要です
.Weight = xlMedium '←太くなります。普通はxlthin
.LineStyle = xlContinuous 'この記述は不要です
End With
線だけであれば、
ActiveChart.SeriesCollection(i).Border.Weight = xlMedium
だけでいいことになります。
ケーススタディ別にやり方をまとめてみますと、
1.グラフを作らなくては…。=⇒第41回の新規一括作成
2.タイトルとか目盛りが気に入らないので直したい=⇒第60回(この回)
3.これはこれでいいが、新しいグラフ(データ系列)を追加したい=⇒第58回により、グラフのデータ系列の情報をとり、これをまねて新しいデータ系列をつくる。第57回により、グラフを追加する
4.ちょっと範囲が違ったよ、1年追加しなければならなくなった。=⇒第58回により、グラフのデータ系列の情報をとり、これを修正して正しいデータ系列をつくる。第59回により、グラフを修正する。
5.ほかのファイルからグラフシートを張り付けたが、データ系列の参照先は前のままだ、これを直したい。=⇒同上
6.グラフ(のデータ系列)を一つ削除したい=⇒手作業で削除。グラフ上データ系列番号がわからないので、手作業で行なうのが無難です。
7.縦軸の標識(例えば"金額"とか)、横軸の標識説明(例えば、"年度"とか)を付けたい=⇒操作の記録でマクロをとり、自分でマクロを組んでください。(タイトルレベルのものなので簡単です)
With ActiveChart
.HasTitle = True
.ChartTitle.Characters.Text = "たいとるタイトル"
.Axes(xlCategory, xlPrimary).HasTitle = True
.Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "年度"
.Axes(xlValue, xlPrimary).HasTitle = True
.Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "金額"
End With
8.10個グラフを追加したいのだが、データ系列のパラメータを作るのが面倒=⇒その通りです。例えば既存で4個グラフがあったとします。そのグラフのデータ系列の情報の取得は必ず行なうはずです。
それを前提に。
既存のデータ系列の情報を取得します。
既存のデータ系列の情報を下に3セット(10個以上にするため)コピーします。4行、あき行、15行となります。
既存のデータ系列が入った隣の2列に、修正前と後の列を入力します。
(新しいデータ系列は、ほとんどの場合、既存のものの列を置き換えるだけでいいと思われます)
既存のもの…データ系列としてH,I,J,K列を使用。
新しいもの…データ系列としてS,T,U,W列を使用したい。
H⇒S、I⇒T、J⇒U、K⇒Wに置き換える。
4行単位で、複数個の置換えを行います。これはマクロです。
(既存のデータ系列での列が四種類しかないため、一気にはできません)
3回繰り返すと、お望みのデータ系列のパラメータができます。
この"複数個置換えマクロ"は、すでに、"第54回目 ちょっとした小物、その他編"で紹介しておいたような気がしたのですが…、
紹介していませんでした。どこかで紹介していなかったか…
ありました、モドキがありました。第20回の後半に本題のマクロをフォローするマクロとして、複数個置換えマクロがありました。
今回の場合は、置換え前後の文字列は、セルに入力されていますので、範囲を取得して、置換え前後の文字列をセットすればいいと思います。
セル範囲を取得して、セルの内容を変数にセットする、よく使われる機能です。
これを第20回のマクロの頭につければいいでしょう。
修正するのは表札とデータ値の座標ですので、1行で3箇所、4行で12箇所。マクロの方がはるかに早いと思います。
何を書いていたのか忘れてしまいました。
グラフ編のケーススタディでした。
9.グラフにコメントを入れてくれ=⇒現状では手作業となりますが、分析してみる価値がありますね。
10.精査したら数字が変わったって…。新しいファイルが送られてきた。これでグラフを作り直してくれってことだ=⇒既存のファイルからグラフシートをコピーします。あとは5.と同じです。
11.複合グラフ(目盛りが二つあるもの)はできないか=⇒業務上ニーズがあったら考えます。
12.折れ線グラフ以外のグラフも作るんだが…=⇒折れ線グラフでまずつくって、適当なところで手作業でグラフの種類を変換する。100%の対応ではないですが…。
13.0から始まらないようなグラフがあるんだが=⇒最小値の設定の仕方で対応できます。
14.例えば五年ごとに縦線が引けないか=⇒エクセルの機能そのものにないようです。一定の間隔での縦線はそれほどの必要はないと思いますが、特定のところに線を引くというニーズはあるかもしれません。その場合は図形ということになりますので、9.のコメントと同じとなります。
15.階段型グラフが出来ないか=⇒昔(5年前)そのことを仲間にいったところ、そんなことは出来ませんということでした。モドキでも出来ないのかといったところ、かなりの剣幕で出来ないの一点張りでした。少し考えたらアイデアが出たのでそれをいったら沈黙に包まれました。それは折れ線グラフを工夫して使ったものでした。
しかしながら、その当時でもできる方法はあったようです。ピボットグラフでできるのです。ということで、ピボットグラフには関心があるので、ピボットグラフを研究したいと思います。
16.データ系列のソートできないか=⇒折れ線グラフで何のメリットがあるのでしょうか。不明です。なんかしらで順番が変わってしまった複数のグラフのデータ系列をそろえるというニーズはありますね。確かに。そのときは、グラフデータ系列の取得し、ワークシート上で順番を変えて(統一して)、それでグラフを修正するというのではどうでしょうか。既存の機能で大丈夫です。ソートの仕方はソートキーを追加すれば、既存のエクセル機能で簡単です。
17.グラフを使って何か図がかけないか=⇒趣旨が意味不明です。階段状のグラフも同じようなことが含まれているのかもしれません。マクロでデータ系列の数値を動かして、グラフを変化させるなども含まれると見ます。中期的な研究課題ですね。面白いところがあるかもしれないという感じがしますが。
18.グラフシートでグラフを越えた書類が出来ないか=⇒かなりマニアックになってきました。頭がどうなっているのかと聞きたい感じがします。確かに今まではグラフにコメントをつける程度でしたが、文書の中にグラフがある、それじゃワークシートにグラフを張り付ければそうなってしまう。意味不明ながら何かがあるかもしれません。頭にしまっておきます。
19.グラフ管理用のワークシートができないか=⇒できると思います。一ファイルに多くのグラフが存在すると、管理のしがいがあるでしょうね。
20.グラフのデータ系列の取得で、表札は座標だけでなく、内容も表示すべきではないか=⇒表札があれば、わかりやすくなりますので、19.とあわせて取り入れてみます。
ここで修正の対象となるのは、タイトル、最小値、最大値、目盛りの間隔、目盛りの表示桁数(これだけは文字で与えてください)です。
考え方も簡単になります。すべてが既存のものの利用となります。
流れは、
0.ワークシートでタイトル等を入力する
1.ワークシートのタイトル等を取得する
2.グラフシートへの移動
3.タイトル等の修正
1.での最初にセットするカーソルの位置は、タイトルが記入されているセルです。そのセルから下に最小値等を記入しておいてください。
セル座標の取得からセルの値の取得ですので、今まで何回もやってきたものです。
2.シートの移動も何回か出てきました。直前にも出てきています。
3.タイトル等の修正は、タイトル等を保管している特殊な場所に、取得した値を入れればいいのです。
その部分は、
'タイトルの修正
ActiveChart.ChartTitle.Text = g_title
'目盛等の修正
ActiveChart.Axes(xlValue).MinimumScale = y_min
ActiveChart.Axes(xlValue).MaximumScale = y_max
ActiveChart.Axes(xlValue).MajorUnit = y_memori
ActiveChart.Axes(xlValue).TickLabels.NumberFormatLocal = y_keta
となります。(第41回"緊急講座グラフ編"の後半のところからの抜き出しです)
ということで、何の苦もなくできてしまいました。
グラフの線を太くするのは、
ActiveChart.SeriesCollection(i).Select
With Selection.Border
.ColorIndex = 57 'この記述は不要です
.Weight = xlMedium '←太くなります。普通はxlthin
.LineStyle = xlContinuous 'この記述は不要です
End With
線だけであれば、
ActiveChart.SeriesCollection(i).Border.Weight = xlMedium
だけでいいことになります。
ケーススタディ別にやり方をまとめてみますと、
1.グラフを作らなくては…。=⇒第41回の新規一括作成
2.タイトルとか目盛りが気に入らないので直したい=⇒第60回(この回)
3.これはこれでいいが、新しいグラフ(データ系列)を追加したい=⇒第58回により、グラフのデータ系列の情報をとり、これをまねて新しいデータ系列をつくる。第57回により、グラフを追加する
4.ちょっと範囲が違ったよ、1年追加しなければならなくなった。=⇒第58回により、グラフのデータ系列の情報をとり、これを修正して正しいデータ系列をつくる。第59回により、グラフを修正する。
5.ほかのファイルからグラフシートを張り付けたが、データ系列の参照先は前のままだ、これを直したい。=⇒同上
6.グラフ(のデータ系列)を一つ削除したい=⇒手作業で削除。グラフ上データ系列番号がわからないので、手作業で行なうのが無難です。
7.縦軸の標識(例えば"金額"とか)、横軸の標識説明(例えば、"年度"とか)を付けたい=⇒操作の記録でマクロをとり、自分でマクロを組んでください。(タイトルレベルのものなので簡単です)
With ActiveChart
.HasTitle = True
.ChartTitle.Characters.Text = "たいとるタイトル"
.Axes(xlCategory, xlPrimary).HasTitle = True
.Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "年度"
.Axes(xlValue, xlPrimary).HasTitle = True
.Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "金額"
End With
8.10個グラフを追加したいのだが、データ系列のパラメータを作るのが面倒=⇒その通りです。例えば既存で4個グラフがあったとします。そのグラフのデータ系列の情報の取得は必ず行なうはずです。
それを前提に。
既存のデータ系列の情報を取得します。
既存のデータ系列の情報を下に3セット(10個以上にするため)コピーします。4行、あき行、15行となります。
既存のデータ系列が入った隣の2列に、修正前と後の列を入力します。
(新しいデータ系列は、ほとんどの場合、既存のものの列を置き換えるだけでいいと思われます)
既存のもの…データ系列としてH,I,J,K列を使用。
新しいもの…データ系列としてS,T,U,W列を使用したい。
H⇒S、I⇒T、J⇒U、K⇒Wに置き換える。
4行単位で、複数個の置換えを行います。これはマクロです。
(既存のデータ系列での列が四種類しかないため、一気にはできません)
3回繰り返すと、お望みのデータ系列のパラメータができます。
この"複数個置換えマクロ"は、すでに、"第54回目 ちょっとした小物、その他編"で紹介しておいたような気がしたのですが…、
紹介していませんでした。どこかで紹介していなかったか…
ありました、モドキがありました。第20回の後半に本題のマクロをフォローするマクロとして、複数個置換えマクロがありました。
今回の場合は、置換え前後の文字列は、セルに入力されていますので、範囲を取得して、置換え前後の文字列をセットすればいいと思います。
セル範囲を取得して、セルの内容を変数にセットする、よく使われる機能です。
これを第20回のマクロの頭につければいいでしょう。
修正するのは表札とデータ値の座標ですので、1行で3箇所、4行で12箇所。マクロの方がはるかに早いと思います。
何を書いていたのか忘れてしまいました。
グラフ編のケーススタディでした。
9.グラフにコメントを入れてくれ=⇒現状では手作業となりますが、分析してみる価値がありますね。
10.精査したら数字が変わったって…。新しいファイルが送られてきた。これでグラフを作り直してくれってことだ=⇒既存のファイルからグラフシートをコピーします。あとは5.と同じです。
11.複合グラフ(目盛りが二つあるもの)はできないか=⇒業務上ニーズがあったら考えます。
12.折れ線グラフ以外のグラフも作るんだが…=⇒折れ線グラフでまずつくって、適当なところで手作業でグラフの種類を変換する。100%の対応ではないですが…。
13.0から始まらないようなグラフがあるんだが=⇒最小値の設定の仕方で対応できます。
14.例えば五年ごとに縦線が引けないか=⇒エクセルの機能そのものにないようです。一定の間隔での縦線はそれほどの必要はないと思いますが、特定のところに線を引くというニーズはあるかもしれません。その場合は図形ということになりますので、9.のコメントと同じとなります。
15.階段型グラフが出来ないか=⇒昔(5年前)そのことを仲間にいったところ、そんなことは出来ませんということでした。モドキでも出来ないのかといったところ、かなりの剣幕で出来ないの一点張りでした。少し考えたらアイデアが出たのでそれをいったら沈黙に包まれました。それは折れ線グラフを工夫して使ったものでした。
しかしながら、その当時でもできる方法はあったようです。ピボットグラフでできるのです。ということで、ピボットグラフには関心があるので、ピボットグラフを研究したいと思います。
16.データ系列のソートできないか=⇒折れ線グラフで何のメリットがあるのでしょうか。不明です。なんかしらで順番が変わってしまった複数のグラフのデータ系列をそろえるというニーズはありますね。確かに。そのときは、グラフデータ系列の取得し、ワークシート上で順番を変えて(統一して)、それでグラフを修正するというのではどうでしょうか。既存の機能で大丈夫です。ソートの仕方はソートキーを追加すれば、既存のエクセル機能で簡単です。
17.グラフを使って何か図がかけないか=⇒趣旨が意味不明です。階段状のグラフも同じようなことが含まれているのかもしれません。マクロでデータ系列の数値を動かして、グラフを変化させるなども含まれると見ます。中期的な研究課題ですね。面白いところがあるかもしれないという感じがしますが。
18.グラフシートでグラフを越えた書類が出来ないか=⇒かなりマニアックになってきました。頭がどうなっているのかと聞きたい感じがします。確かに今まではグラフにコメントをつける程度でしたが、文書の中にグラフがある、それじゃワークシートにグラフを張り付ければそうなってしまう。意味不明ながら何かがあるかもしれません。頭にしまっておきます。
19.グラフ管理用のワークシートができないか=⇒できると思います。一ファイルに多くのグラフが存在すると、管理のしがいがあるでしょうね。
20.グラフのデータ系列の取得で、表札は座標だけでなく、内容も表示すべきではないか=⇒表札があれば、わかりやすくなりますので、19.とあわせて取り入れてみます。
2007年11月14日水曜日
第59回目 グラフ関係(その5;グラフのデータ系列を変更する)
○第59回目 グラフ関係(その5;グラフのデータ系列を変更する)
データ系列の変更は簡単です。
これまでやってきたことからのちょっとした改良です。
実際の処理はこうなります。
第57回のマクロで、既存のグラフのデータ系列をワークシートにとります。
そこで必要な修正をします。
そして、データ系列の範囲を指定してから始まります。データ系列はすべて指定してください。
グラフは番号によって区分されています。その番号のデータ系列を新しいものに置き換えてやればいいことになります。
グラフの追加と同じなのですが、追加の場合は、既存のグラフ番号の次からはじめますが、修正ですので、1からはじめ、既存の番号のところまで行います。
第57回で。グラフを追加するメインの処理がありましたが、
ActiveChart.SeriesCollection.NewSeries
ActiveChart.SeriesCollection(g_cnt + i).ChartType = xlLine
ActiveChart.SeriesCollection(g_cnt + i).Name = "=Sheet2!R28C5"
ActiveChart.SeriesCollection(g_cnt + i).XValues = "=Sheet2!R29C3:R48C3"
ActiveChart.SeriesCollection(g_cnt + i).Values = "=Sheet2!R29C5:R48C5"
このうち、後半の三行を生かしてもらい、( )内を"i"だけに。、内容を取得した変数にします。
そして、2007ように一文にします
ActiveChart.SeriesCollection.item(i).Formula = _
"=SERIES(" & x_sheet(i) & "!" & x_name(i) & "," & _
x_sheet(i) & "!" & x_midashi(i) & "," & _
x_sheet(i) & "!" & XX(i) & "," & Str(g_cnt + i) & ")"
(注)エクセル2007では、座標はA1方式で大丈夫です。
ほとんど、グラフの追加と同じになります。
また、考え方を変えて、グラフ(のデータ系列)を全部削除してから、追加でもいいと思います。
削除は、マクロの記録でとると、次のようになります
ActiveChart.SeriesCollection(3).Select
Selection.Delete
一般化して、
ActiveChart.SeriesCollection(i).Delete
でいいでしょう。
データ系列の変更は簡単です。
これまでやってきたことからのちょっとした改良です。
実際の処理はこうなります。
第57回のマクロで、既存のグラフのデータ系列をワークシートにとります。
そこで必要な修正をします。
そして、データ系列の範囲を指定してから始まります。データ系列はすべて指定してください。
グラフは番号によって区分されています。その番号のデータ系列を新しいものに置き換えてやればいいことになります。
グラフの追加と同じなのですが、追加の場合は、既存のグラフ番号の次からはじめますが、修正ですので、1からはじめ、既存の番号のところまで行います。
第57回で。グラフを追加するメインの処理がありましたが、
ActiveChart.SeriesCollection.NewSeries
ActiveChart.SeriesCollection(g_cnt + i).ChartType = xlLine
ActiveChart.SeriesCollection(g_cnt + i).Name = "=Sheet2!R28C5"
ActiveChart.SeriesCollection(g_cnt + i).XValues = "=Sheet2!R29C3:R48C3"
ActiveChart.SeriesCollection(g_cnt + i).Values = "=Sheet2!R29C5:R48C5"
このうち、後半の三行を生かしてもらい、( )内を"i"だけに。、内容を取得した変数にします。
そして、2007ように一文にします
ActiveChart.SeriesCollection.item(i).Formula = _
"=SERIES(" & x_sheet(i) & "!" & x_name(i) & "," & _
x_sheet(i) & "!" & x_midashi(i) & "," & _
x_sheet(i) & "!" & XX(i) & "," & Str(g_cnt + i) & ")"
(注)エクセル2007では、座標はA1方式で大丈夫です。
ほとんど、グラフの追加と同じになります。
また、考え方を変えて、グラフ(のデータ系列)を全部削除してから、追加でもいいと思います。
削除は、マクロの記録でとると、次のようになります
ActiveChart.SeriesCollection(3).Select
Selection.Delete
一般化して、
ActiveChart.SeriesCollection(i).Delete
でいいでしょう。
2007年11月10日土曜日
第58回目 グラフ関係(その4;グラフのデータ系列を取る)
○第58回目 グラフ関係(その4;グラフのデータ系列を取る)
今回は、グラフからデータ系列の情報を取り出しましょう。
データ系列の情報は4つで、シート名、表札の座標、横軸の座標、データ値の座標のことです。
これはそれほど難しくないのですが、コマンドが何を使うのかがわかりません。
いろいろ調べてみた結果、
ActiveChart.SeriesCollection.item(i).Formula
を使うことがわかりました。
Dim d_graph(30)
With ActiveChart.SeriesCollection
xx_suu = .Count 'グラフの数です
For i = 1 To xx_suu
d_graph(i) = .item(i).Formula
MsgBox "系列" & i & "のソースデータ範囲は ⇒" _
& vbCrLf & d_graph(i) '確認用
Next i
End With
を動かして、データ系列の情報がどうなっているかみてください。
=SERIES(y=ax2+bx+c!$B$1,y=ax2+bx+c!$A$2:$A$98,y=ax2+bx+c!$B$2:$B$98,1)
となっているので、これを分解し、データ系列の4項目を求めます。
ttt = "=SERIES(y=ax2+bx+c!$B$1,y=ax2+bx+c!$A$2:$A$98,y=ax2+bx+c!$B$2:$B$98,1)"
として、分解してみます。
p1=instr(ttt,"(")
p9=instr(ttt,"!")
x_sheet(i)=mid(ttt,p1+1,p9-p1-1)
ttt=mid(ttt,p9+1) '使った部分は取り除いていきます
p1=instr(ttt,",")
x_name(i)=left(ttt,p1-1)
ttt=mid(ttt,p1+1)
p1=instr(ttt,"!")
p9=instr(ttt,",")
x_midashi(i)=mid(ttt,p1+1,p9-p1-1)
ttt=mid(ttt,p9+1)
p1=instr(ttt,"!")
p9=instr(ttt,",")
XX(i)=mid(ttt,p1+1,p9-p1-1)
ttt=mid(ttt,p9+1)
p1=instr(ttt,")")
g_no(i)=left(ttt,p1-1)
これをfor toでxx_suu繰り返し情報をとります。
次にこの情報をワークシートに書き込みます。
シート移動の機能でシートを最寄のワークシートに移してください。
そのシートの特別な場所に書き込みます。グラフ管理表が作成されているので、その場所に書き込みました。F5から書き込みます。
for i=1 to xx_suu
cells(lr004+i,lc005) = "=" & x_sheet(i) & "!" & x_name(i) '計算式グラフの表札
cells(lr004+i,lc005+1)=x_sheet(i)
cells(lr004+i,lc005+2)=x_name(i)
cells(lr004+i,lc005+3)=x_midashi(i)
cells(lr004+i,lc005+4)=XX(i)
next i

このデータ系列の情報を活用して、新しいデータ系列の情報を作ってみてください。それを前回のマクロでグラフに追加してみてください。
今回は、グラフからデータ系列の情報を取り出しましょう。
データ系列の情報は4つで、シート名、表札の座標、横軸の座標、データ値の座標のことです。
これはそれほど難しくないのですが、コマンドが何を使うのかがわかりません。
いろいろ調べてみた結果、
ActiveChart.SeriesCollection.item(i).Formula
を使うことがわかりました。
Dim d_graph(30)
With ActiveChart.SeriesCollection
xx_suu = .Count 'グラフの数です
For i = 1 To xx_suu
d_graph(i) = .item(i).Formula
MsgBox "系列" & i & "のソースデータ範囲は ⇒" _
& vbCrLf & d_graph(i) '確認用
Next i
End With
を動かして、データ系列の情報がどうなっているかみてください。
=SERIES(y=ax2+bx+c!$B$1,y=ax2+bx+c!$A$2:$A$98,y=ax2+bx+c!$B$2:$B$98,1)
となっているので、これを分解し、データ系列の4項目を求めます。
ttt = "=SERIES(y=ax2+bx+c!$B$1,y=ax2+bx+c!$A$2:$A$98,y=ax2+bx+c!$B$2:$B$98,1)"
として、分解してみます。
p1=instr(ttt,"(")
p9=instr(ttt,"!")
x_sheet(i)=mid(ttt,p1+1,p9-p1-1)
ttt=mid(ttt,p9+1) '使った部分は取り除いていきます
p1=instr(ttt,",")
x_name(i)=left(ttt,p1-1)
ttt=mid(ttt,p1+1)
p1=instr(ttt,"!")
p9=instr(ttt,",")
x_midashi(i)=mid(ttt,p1+1,p9-p1-1)
ttt=mid(ttt,p9+1)
p1=instr(ttt,"!")
p9=instr(ttt,",")
XX(i)=mid(ttt,p1+1,p9-p1-1)
ttt=mid(ttt,p9+1)
p1=instr(ttt,")")
g_no(i)=left(ttt,p1-1)
これをfor toでxx_suu繰り返し情報をとります。
次にこの情報をワークシートに書き込みます。
シート移動の機能でシートを最寄のワークシートに移してください。
そのシートの特別な場所に書き込みます。グラフ管理表が作成されているので、その場所に書き込みました。F5から書き込みます。
for i=1 to xx_suu
cells(lr004+i,lc005) = "=" & x_sheet(i) & "!" & x_name(i) '計算式グラフの表札
cells(lr004+i,lc005+1)=x_sheet(i)
cells(lr004+i,lc005+2)=x_name(i)
cells(lr004+i,lc005+3)=x_midashi(i)
cells(lr004+i,lc005+4)=XX(i)
next i

このデータ系列の情報を活用して、新しいデータ系列の情報を作ってみてください。それを前回のマクロでグラフに追加してみてください。
2007年11月7日水曜日
第57回目 グラフ関係(その3;グラフの追加)
○第57回目 グラフ関係(その3;グラフの追加)
エクセル2003でグラフの操作を行なって、マクロの記録を取ってみました。
【グラフを追加する場合】
ActiveChart.SeriesCollection.NewSeries
ActiveChart.SeriesCollection(2).Name = "=Sheet2!R28C5"
ActiveChart.SeriesCollection(2).XValues = "=Sheet2!R29C3:R48C3"
ActiveChart.SeriesCollection(2).Values = "=Sheet2!R29C5:R48C5"
前提としてはすでに一本のグラフがあり、二本目を追加した場合です。"(2)"はそういうことを表します。
このイコールの後に、もとにしたい座標を変数で与えればいいことになります。困ったことは座標の表示が、RC方式になっていることです。
面白い関数がありました。
"B10:B15"を与えると、"R10C2:R15C2"に変換してくれるのです。
Sub A1_R1C1_7()
inputFormula = "B10:B15"
outff = Application.ConvertFormula(Formula:=inputFormula, _
fromReferenceStyle:=xlA1, toReferenceStyle:=xlR1C1,ToAbsolute:=xlAbsolute)
MsgBox outff
End Sub
これを使えばいいですね。
これを前提に組み立ててみましょう。
パラメータとしては、シート名、表札の座標、横軸の座標、データ値の座標となります。この4項目が1セットとなります。必要なだけ作ってください。
これをセルに設定します。セットが変わると次の行となります。
パラメータの範囲を設定してマクロを動かします。
1.パラメータの取得(追加するグラフ数も求めておきます)
2.グラフシートへの移動
3.既存のグラフ数の取得(g_cnt = ActiveChart.SeriesCollection.Count)
4.座標を加工しグラフの追加
変数として、
x_sheet(30), x_name(30), x_midashi(30), XX(30)
⇒シート名、表札・横軸・データ値の座標
xx_suu
⇒追加するグラフ数
を設定します。
【補足説明】
1.について
よく出てくる"セル範囲の取得"の機能です。そのうちの行数が追加グラフの数となります。パラメータを配列変数に入れるのは順番さえ間違わなければ簡単です。(3つの場合の範囲の例示です)
2.について
シートの移動を使います。次の基本機能を参照してください。グラフシートとワークシートは近くにおいてください。デフォルト値ではグラフシートはワークシートの次となっています。
ii_max = ActiveWorkbook.sheets.Count
ii0 = ActiveSheet.Index
'シートの移動(シートは相対位置で指定します)
sh_cnt = InputBox("新しいシートの場所を入れてください。… -1 , 0 , 1 …など", Default:=1, xpos:=2000, ypos:=3000)
Sheets(ii0 + sh_cnt).Select
3.について
なし
4.について
追加するグラフの数だけ繰り返してください。
ActiveChart.SeriesCollection.NewSeries
ActiveChart.SeriesCollection(g_cnt + i).ChartType = xlLine
ActiveChart.SeriesCollection(g_cnt + i).Name = "=Sheet2!R28C5"
ActiveChart.SeriesCollection(g_cnt + i).XValues = "=Sheet2!R29C3:R48C3"
ActiveChart.SeriesCollection(g_cnt + i).Values = "=Sheet2!R29C5:R48C5"
例えば、"=Sheet2!R28C5"の作り方は、
x_name(i) = Application.ConvertFormula(Formula:=x_name(i), _
fromReferenceStyle:=xlA1, toReferenceStyle:=xlR1C1,ToAbsolute:=xlAbsolute)
として
"=" & x_sheet(i) & "!" & x_name(i)
とすればいいのです。
エクセル2007でも以上のことで大丈夫だと思うのですが、表札の座標ではなく値が入ってしまうため、後半の三行を次のようにしています。
'=SERIES(y=ax2+bx+c!$B$1,y=ax2+bx+c!$A$2:$A$98,y=ax2+bx+c!$B$2:$B$98,1)の形式を再現
ActiveChart.SeriesCollection.item(g_cnt + i).Formula = _
"=SERIES(" & x_sheet(i) & "!" & x_name(i) & "," & _
x_sheet(i) & "!" & x_midashi(i) & "," & _
x_sheet(i) & "!" & XX(i) & "," & Str(g_cnt + i) & ")"
(注)エクセル2007では、座標はA1方式で大丈夫です。
エクセル2003でグラフの操作を行なって、マクロの記録を取ってみました。
【グラフを追加する場合】
ActiveChart.SeriesCollection.NewSeries
ActiveChart.SeriesCollection(2).Name = "=Sheet2!R28C5"
ActiveChart.SeriesCollection(2).XValues = "=Sheet2!R29C3:R48C3"
ActiveChart.SeriesCollection(2).Values = "=Sheet2!R29C5:R48C5"
前提としてはすでに一本のグラフがあり、二本目を追加した場合です。"(2)"はそういうことを表します。
このイコールの後に、もとにしたい座標を変数で与えればいいことになります。困ったことは座標の表示が、RC方式になっていることです。
面白い関数がありました。
"B10:B15"を与えると、"R10C2:R15C2"に変換してくれるのです。
Sub A1_R1C1_7()
inputFormula = "B10:B15"
outff = Application.ConvertFormula(Formula:=inputFormula, _
fromReferenceStyle:=xlA1, toReferenceStyle:=xlR1C1,ToAbsolute:=xlAbsolute)
MsgBox outff
End Sub
これを使えばいいですね。
これを前提に組み立ててみましょう。
パラメータとしては、シート名、表札の座標、横軸の座標、データ値の座標となります。この4項目が1セットとなります。必要なだけ作ってください。
これをセルに設定します。セットが変わると次の行となります。
パラメータの範囲を設定してマクロを動かします。
1.パラメータの取得(追加するグラフ数も求めておきます)
2.グラフシートへの移動
3.既存のグラフ数の取得(g_cnt = ActiveChart.SeriesCollection.Count)
4.座標を加工しグラフの追加
変数として、
x_sheet(30), x_name(30), x_midashi(30), XX(30)
⇒シート名、表札・横軸・データ値の座標
xx_suu
⇒追加するグラフ数
を設定します。
【補足説明】
1.について
よく出てくる"セル範囲の取得"の機能です。そのうちの行数が追加グラフの数となります。パラメータを配列変数に入れるのは順番さえ間違わなければ簡単です。(3つの場合の範囲の例示です)

2.について
シートの移動を使います。次の基本機能を参照してください。グラフシートとワークシートは近くにおいてください。デフォルト値ではグラフシートはワークシートの次となっています。
ii_max = ActiveWorkbook.sheets.Count
ii0 = ActiveSheet.Index
'シートの移動(シートは相対位置で指定します)
sh_cnt = InputBox("新しいシートの場所を入れてください。… -1 , 0 , 1 …など", Default:=1, xpos:=2000, ypos:=3000)
Sheets(ii0 + sh_cnt).Select
3.について
なし
4.について
追加するグラフの数だけ繰り返してください。
ActiveChart.SeriesCollection.NewSeries
ActiveChart.SeriesCollection(g_cnt + i).ChartType = xlLine
ActiveChart.SeriesCollection(g_cnt + i).Name = "=Sheet2!R28C5"
ActiveChart.SeriesCollection(g_cnt + i).XValues = "=Sheet2!R29C3:R48C3"
ActiveChart.SeriesCollection(g_cnt + i).Values = "=Sheet2!R29C5:R48C5"
例えば、"=Sheet2!R28C5"の作り方は、
x_name(i) = Application.ConvertFormula(Formula:=x_name(i), _
fromReferenceStyle:=xlA1, toReferenceStyle:=xlR1C1,ToAbsolute:=xlAbsolute)
として
"=" & x_sheet(i) & "!" & x_name(i)
とすればいいのです。
エクセル2007でも以上のことで大丈夫だと思うのですが、表札の座標ではなく値が入ってしまうため、後半の三行を次のようにしています。
'=SERIES(y=ax2+bx+c!$B$1,y=ax2+bx+c!$A$2:$A$98,y=ax2+bx+c!$B$2:$B$98,1)の形式を再現
ActiveChart.SeriesCollection.item(g_cnt + i).Formula = _
"=SERIES(" & x_sheet(i) & "!" & x_name(i) & "," & _
x_sheet(i) & "!" & x_midashi(i) & "," & _
x_sheet(i) & "!" & XX(i) & "," & Str(g_cnt + i) & ")"
(注)エクセル2007では、座標はA1方式で大丈夫です。
2007年11月3日土曜日
第56回目 グラフ関係(その2)
○第56回目 グラフ関係(その2)
とうとうグラフです。グラフはめんどくさいです。あれこれと細かに設定しなければ出来ないので、筆者などは二の足を踏んでしまいます。
グラフ関係でマクロ操作により7割ぐらいカバーできるものが出来ないのか、という思いを強く持ちます。私どものところは時系列的な変化を取ることが多いので、主に折れ線グラフとなります。
それをベースに何とかマクロでできないものだろうか…。
という問題意識が、ある時ほぼ解決されました、というより、その糸口が見えてきました。
第41回を"その1"としますので、今回は"その2"となります。
グラフ作成のパラメータをつくりそれを元にグラフを作る・更新するという機能をとりあげます。
さて、基本的な機能として何が必要でしょうか。その分析で60%完了です。
1.グラフに新しい系列のデータを追加する。
2.グラフのデータ系列を違う系列に変更する。
※データ系列とは、データの表札(凡例に出てくるもの)、横軸の数値、データ値となります。
3.グラフの属性(タイトル、目盛りなど)を簡単に修正する。
4.グラフの削除(削除はクリックしdeleteキーで可能なのでマクロでは面白くないかもしれません)
こんな例がありました。すでにあるグラフが出来ています(データ系列の参照は同一ファイル)。違う前提条件で求められたデータ系列が別ファイルにあります。ファイル内の体系は既存のファイルと同じです。このデータ系列で同じグラフを作りたい(データ系列を置き換えたい)。既存のグラフと比べるとデータ系列のファイル名のみが違うだけです。
(グラフ込みのファイルをコピーして、それを元に違う前提条件で計算しなおせば、改めてグラフを作る必要がないという意見があると思いますが、作者が違う時は、データ系列があるそれぞれのファイルにグラフを挿入する必要性が出てきます。そういったケースを想定しました)
これを次のようにやっていました。
1.グラフシートを新しいファイルにコピーする。(この段階で、データ系列以外は、条件を満たします。データ系列は元のファイルで参照されているもののままです)
2.グラフを一つ一つクリックして、グラフのデータ系列指定のタブを出し、データ系列の表札、横軸数値、データ値の指定座標から、ファイル名を削除する(ファイル名を削除すると当該ファイルのシート名、座標からリンクされる)。
2の操作が大変で、グラフ作成に慣れない者にとっては苦痛でした。画面を凝視する必要があり眼がしょぼしょぼになります。通常のワークシートであれば、置換えがあるので簡単に修正できます。その頭があると、操作が更に苦痛となってきます。
もっと簡単な操作でできないのか…。
この場合は、その後更に別の二つデータ系列を追加しなくてはならず、結構疲労が残りました。
これを次のようにしようというものです。
1.はそのままです。
2.を分解し、まず、現状のデータ系列の情報を取得し、ワークシートに書き出します。情報とは前にも述べたとおり、表札と横軸とデータ値の三つ座標情報です。それぞれにファイル名がついていますので、それを削除します。一括の置換えで一気に出来ます。
3.次に、修正した情報によりグラフを直すという、操作です。(機能的にはそれぞれの座標を修正することも可能とします)。
これにより、マウスによる操作から、ワークシートレベルでの操作になり、スムーズに進みます。
新しい系列のグラフの追加は、先ほどの情報(パラメータ)をもとに、新たらしい系列の情報を作ります(コピーし修正)。そして、それを元にグラフを追加する、ということで終了です。
その他の機能として、"3.グラフの属性(タイトル、目盛りなど)を簡単に修正する"がりますが、対象は、タイトル、横軸目盛の最小値、最大値、目盛間隔、目盛の表示桁数です。
グラフの削除のマクロ化は気が乗りません。
今回は能書きだけです。
【グラフ管理表の例】

※グラフ関係のマクロでのコマンドは解説が少ないので苦労します。エクセル2007では、マクロの記録を動かしても、たいした内容しか記録されないために、かなりの試行錯誤となります。
とうとうグラフです。グラフはめんどくさいです。あれこれと細かに設定しなければ出来ないので、筆者などは二の足を踏んでしまいます。
グラフ関係でマクロ操作により7割ぐらいカバーできるものが出来ないのか、という思いを強く持ちます。私どものところは時系列的な変化を取ることが多いので、主に折れ線グラフとなります。
それをベースに何とかマクロでできないものだろうか…。
という問題意識が、ある時ほぼ解決されました、というより、その糸口が見えてきました。
第41回を"その1"としますので、今回は"その2"となります。
グラフ作成のパラメータをつくりそれを元にグラフを作る・更新するという機能をとりあげます。
さて、基本的な機能として何が必要でしょうか。その分析で60%完了です。
1.グラフに新しい系列のデータを追加する。
2.グラフのデータ系列を違う系列に変更する。
※データ系列とは、データの表札(凡例に出てくるもの)、横軸の数値、データ値となります。
3.グラフの属性(タイトル、目盛りなど)を簡単に修正する。
4.グラフの削除(削除はクリックしdeleteキーで可能なのでマクロでは面白くないかもしれません)
こんな例がありました。すでにあるグラフが出来ています(データ系列の参照は同一ファイル)。違う前提条件で求められたデータ系列が別ファイルにあります。ファイル内の体系は既存のファイルと同じです。このデータ系列で同じグラフを作りたい(データ系列を置き換えたい)。既存のグラフと比べるとデータ系列のファイル名のみが違うだけです。
(グラフ込みのファイルをコピーして、それを元に違う前提条件で計算しなおせば、改めてグラフを作る必要がないという意見があると思いますが、作者が違う時は、データ系列があるそれぞれのファイルにグラフを挿入する必要性が出てきます。そういったケースを想定しました)
これを次のようにやっていました。
1.グラフシートを新しいファイルにコピーする。(この段階で、データ系列以外は、条件を満たします。データ系列は元のファイルで参照されているもののままです)
2.グラフを一つ一つクリックして、グラフのデータ系列指定のタブを出し、データ系列の表札、横軸数値、データ値の指定座標から、ファイル名を削除する(ファイル名を削除すると当該ファイルのシート名、座標からリンクされる)。
2の操作が大変で、グラフ作成に慣れない者にとっては苦痛でした。画面を凝視する必要があり眼がしょぼしょぼになります。通常のワークシートであれば、置換えがあるので簡単に修正できます。その頭があると、操作が更に苦痛となってきます。
もっと簡単な操作でできないのか…。
この場合は、その後更に別の二つデータ系列を追加しなくてはならず、結構疲労が残りました。
これを次のようにしようというものです。
1.はそのままです。
2.を分解し、まず、現状のデータ系列の情報を取得し、ワークシートに書き出します。情報とは前にも述べたとおり、表札と横軸とデータ値の三つ座標情報です。それぞれにファイル名がついていますので、それを削除します。一括の置換えで一気に出来ます。
3.次に、修正した情報によりグラフを直すという、操作です。(機能的にはそれぞれの座標を修正することも可能とします)。
これにより、マウスによる操作から、ワークシートレベルでの操作になり、スムーズに進みます。
新しい系列のグラフの追加は、先ほどの情報(パラメータ)をもとに、新たらしい系列の情報を作ります(コピーし修正)。そして、それを元にグラフを追加する、ということで終了です。
その他の機能として、"3.グラフの属性(タイトル、目盛りなど)を簡単に修正する"がりますが、対象は、タイトル、横軸目盛の最小値、最大値、目盛間隔、目盛の表示桁数です。
グラフの削除のマクロ化は気が乗りません。
今回は能書きだけです。
【グラフ管理表の例】

※グラフ関係のマクロでのコマンドは解説が少ないので苦労します。エクセル2007では、マクロの記録を動かしても、たいした内容しか記録されないために、かなりの試行錯誤となります。
2007年10月31日水曜日
第55回目 ちょっとした工夫、サブルーチン化
○第55回目 ちょっとした工夫、サブルーチン化
いろいろマクロを作りましたので、ショートカットで動くものはいいのですが、その実行が、Alt+F8から該当のマクロを選択し実行となると、後ろにあるものは、該当のものにたどり着くまで大変になってきます。手間がかかり、面倒臭くなってきます。
ショートカットも限られているのでなんとならないのか、という対応です。
対応はシンプルです。
各マクロをサブルーチン化した親マクロを作り、その中で作業区分を入力するようにすれば、ショートカットキーは最初の親マクロを呼び出すだけですみます。後は画面で、動かしたい処理の番号を入力すればいいことになります。
今まで紹介したマクロのように、他と独立したもの(変数の受け渡しがない)をサブルーチン化するのはとても簡単です。
ここでマクロを特定するのは、Sub文の後のマクロ名です。
Sub 親マクロ()
dim kubun
'処理区分の入力。
kubun = InputBox("処理区分を入れてください。" & _
"1=⇒子マクロ01の処理" & vbCrLf & _
"2=⇒子マクロ02の処理" & vbCrLf & _
"3=⇒子マクロ03の処理" & vbCrLf & _
"5=⇒子マクロ05の処理" & vbCrLf & _
"9=⇒子マクロ09の処理" ", xpos:=2000, ypos:=3000, Default:=1)
'-------------------------------------------------------------------------
'-------------------------------------------------------------------------
Select Case kubun
'子マクロ01の処理
Case "1"
子マクロ01 'マクロ名を指定します
'子マクロ02の処理
Case "2"
子マクロ02
'子マクロ03の処理
Case "3"
子マクロ03
'子マクロ05の処理
Case "5"
子マクロ05
'子マクロ05の処理
Case "9"
子マクロ05
Case Else
Exit Sub
End Select
End Sub
上記のように、Case文の次の行に、マクロの名前を書けばいいのです。
変数はそれぞれのマクロで定義しているのでそれが使われます、改めて気にする必要はありません。
こうすれば、親マクロにショートカットキーをあてがっておけばいいことになります。
vbCrLf は、メッセージボックス内の改行を表しています。ですから、各選択肢は、1行単位で表示されることになります。余り多いとメッセージボックスに表示できない場合があるようです。
メッセージボックスでの表示の感じは、マクロを全部作らなくても、上記の例で言えば、"Select Case kubun"文の前の行に、exit Sub文を入れれば、簡単にわかります。試してみてください。
※それぞれのマクロで、実行前のセル等の指定の仕方が異なる可能性が高いので、マニュアルを作るなりして間違えないようにしてください。
第47回からはじめた、"ちょっとした小物"をまとめて、サブルーチン化するのもいいのではないでしょうか。
いろいろマクロを作りましたので、ショートカットで動くものはいいのですが、その実行が、Alt+F8から該当のマクロを選択し実行となると、後ろにあるものは、該当のものにたどり着くまで大変になってきます。手間がかかり、面倒臭くなってきます。
ショートカットも限られているのでなんとならないのか、という対応です。
対応はシンプルです。
各マクロをサブルーチン化した親マクロを作り、その中で作業区分を入力するようにすれば、ショートカットキーは最初の親マクロを呼び出すだけですみます。後は画面で、動かしたい処理の番号を入力すればいいことになります。
今まで紹介したマクロのように、他と独立したもの(変数の受け渡しがない)をサブルーチン化するのはとても簡単です。
ここでマクロを特定するのは、Sub文の後のマクロ名です。
Sub 親マクロ()
dim kubun
'処理区分の入力。
kubun = InputBox("処理区分を入れてください。" & _
"1=⇒子マクロ01の処理" & vbCrLf & _
"2=⇒子マクロ02の処理" & vbCrLf & _
"3=⇒子マクロ03の処理" & vbCrLf & _
"5=⇒子マクロ05の処理" & vbCrLf & _
"9=⇒子マクロ09の処理" ", xpos:=2000, ypos:=3000, Default:=1)
'-------------------------------------------------------------------------
'-------------------------------------------------------------------------
Select Case kubun
'子マクロ01の処理
Case "1"
子マクロ01 'マクロ名を指定します
'子マクロ02の処理
Case "2"
子マクロ02
'子マクロ03の処理
Case "3"
子マクロ03
'子マクロ05の処理
Case "5"
子マクロ05
'子マクロ05の処理
Case "9"
子マクロ05
Case Else
Exit Sub
End Select
End Sub
上記のように、Case文の次の行に、マクロの名前を書けばいいのです。
変数はそれぞれのマクロで定義しているのでそれが使われます、改めて気にする必要はありません。
こうすれば、親マクロにショートカットキーをあてがっておけばいいことになります。
vbCrLf は、メッセージボックス内の改行を表しています。ですから、各選択肢は、1行単位で表示されることになります。余り多いとメッセージボックスに表示できない場合があるようです。
メッセージボックスでの表示の感じは、マクロを全部作らなくても、上記の例で言えば、"Select Case kubun"文の前の行に、exit Sub文を入れれば、簡単にわかります。試してみてください。
※それぞれのマクロで、実行前のセル等の指定の仕方が異なる可能性が高いので、マニュアルを作るなりして間違えないようにしてください。
第47回からはじめた、"ちょっとした小物"をまとめて、サブルーチン化するのもいいのではないでしょうか。
2007年10月27日土曜日
第54回目 ちょっとした小物、その他編
○第54回目 ちょっとした小物、その他編
小物その他編です。
1.セルの結合
2.セルの結合の解除
3.文字を中央(横)にセット
4.文字を中央(縦)にセット
5.連番入力
6.エクセルで使用できるユーザー関数
1から4については、操作マクロ記録でマクロをとってください。1の場合は合わせて文字中央(横及び縦)を入れてください。通常はそのように使うはずです。
基本的なコマンドとまとめておきます
基本的なコマンド(範囲を指定した後に実行)
・セルの結合
Selection.Merge
・セルの結合を解除
Selection.UnMerge
・字を横中央に
Selection.HorizontalAlignment = xlCenter
・文字を縦中央に
Selection.VerticalAlignment = xlCenter
5.連番入力
これは指定範囲に連番を入れるマクロです。
付加機能としては、
(1)縦だけでなく横も出来る
(2)スタートの値が決められる(通常は最初のセルに入っている値を元にする)
(3)1だけでなく、任意の飛び数が決められる
詳しく説明すると
(1)指定範囲の座標によります。最初と最後で行が変わっていれば縦、列が変わっていれば横と判断します。指定範囲の座標取得、gyo1とgyo9が等しいか否かです。
(2)input関数による指定
InputBox("最初の数値を入れてください。そのままは、0", , 0)
(3)input関数による指定
InputBox("偏差を入れてください。通常は、1 ", , 1)
となります。
具体的に番号をセルにいれるのは、縦横で別処理になります。
一例として、
If flag1 = 1 Then '横方向のコピー
For i = 1 To retu_cnt
Cells(gyo11, retu11 + i) = Cells(gyo11, retu11) + i * no1
Next i
End If
6.エクセルで使用できるユーザー関数
自分で定義した関数をエクセル本体で使うということです。
関数の入力は、Alt+I+Fで呼び出します。その中で"関数の定義"の中で"ユーザー定義"を選択すると、ユーザー関数として定義したものが使用できます。
Function 加重按分01(ByVal nn1, nn0, mm, keta As Double) As Double
'nn1は個別値,nn0は合計値,mmは按分したいもの,ketaは四捨五入した時の桁
加重按分01 = Round(mm * (nn1 / nn0), keta)
End Function
というように、モジュールに書き込みます。
subからFunctionを呼び出す時は、
xx = 加重按分01(SS1,SS2,SS3,SS4)
( )内に変数を記述ということが通常のマクロとは違うところです。
四つの変数には、呼び出す前に計算の元となる数値を入れておいてください。
エクセルの中での使用の仕方は、Alt+I+Fで該当する関数を選ぶと選択形式になって簡単に記述できます。
直接、計算式を作る場合は、"=加重按分01(D21,D8,D11,D6)"とセルに書き込めばいいのです。
よく使う計算式をマクロで作って本体のエクセルで使う、という芸当が出来るようになります。オーダーメイドでかっこいい、という感じでしょうか。
筆者の場合は、列番号を列記号に変換する関数をユーザー定義関数として使っています。
しかし、エクセルの機能があまりに広いので、特別にほかに作る必要性がなかなか見つからないと思いますが、ニーズをかぎ分ける嗅覚を敏感にすると出てくるかもしれません(この方式があること自体考えたことがないというのが正直なところなのでないでしょうか。有効活用を本気になって考えてみれば宝の山…、かも知れません)。
小物その他編です。
1.セルの結合
2.セルの結合の解除
3.文字を中央(横)にセット
4.文字を中央(縦)にセット
5.連番入力
6.エクセルで使用できるユーザー関数
1から4については、操作マクロ記録でマクロをとってください。1の場合は合わせて文字中央(横及び縦)を入れてください。通常はそのように使うはずです。
基本的なコマンドとまとめておきます
基本的なコマンド(範囲を指定した後に実行)
・セルの結合
Selection.Merge
・セルの結合を解除
Selection.UnMerge
・字を横中央に
Selection.HorizontalAlignment = xlCenter
・文字を縦中央に
Selection.VerticalAlignment = xlCenter
5.連番入力
これは指定範囲に連番を入れるマクロです。
付加機能としては、
(1)縦だけでなく横も出来る
(2)スタートの値が決められる(通常は最初のセルに入っている値を元にする)
(3)1だけでなく、任意の飛び数が決められる
詳しく説明すると
(1)指定範囲の座標によります。最初と最後で行が変わっていれば縦、列が変わっていれば横と判断します。指定範囲の座標取得、gyo1とgyo9が等しいか否かです。
(2)input関数による指定
InputBox("最初の数値を入れてください。そのままは、0", , 0)
(3)input関数による指定
InputBox("偏差を入れてください。通常は、1 ", , 1)
となります。
具体的に番号をセルにいれるのは、縦横で別処理になります。
一例として、
If flag1 = 1 Then '横方向のコピー
For i = 1 To retu_cnt
Cells(gyo11, retu11 + i) = Cells(gyo11, retu11) + i * no1
Next i
End If
6.エクセルで使用できるユーザー関数
自分で定義した関数をエクセル本体で使うということです。
関数の入力は、Alt+I+Fで呼び出します。その中で"関数の定義"の中で"ユーザー定義"を選択すると、ユーザー関数として定義したものが使用できます。
Function 加重按分01(ByVal nn1, nn0, mm, keta As Double) As Double
'nn1は個別値,nn0は合計値,mmは按分したいもの,ketaは四捨五入した時の桁
加重按分01 = Round(mm * (nn1 / nn0), keta)
End Function
というように、モジュールに書き込みます。
subからFunctionを呼び出す時は、
xx = 加重按分01(SS1,SS2,SS3,SS4)
( )内に変数を記述ということが通常のマクロとは違うところです。
四つの変数には、呼び出す前に計算の元となる数値を入れておいてください。
エクセルの中での使用の仕方は、Alt+I+Fで該当する関数を選ぶと選択形式になって簡単に記述できます。
直接、計算式を作る場合は、"=加重按分01(D21,D8,D11,D6)"とセルに書き込めばいいのです。
よく使う計算式をマクロで作って本体のエクセルで使う、という芸当が出来るようになります。オーダーメイドでかっこいい、という感じでしょうか。
筆者の場合は、列番号を列記号に変換する関数をユーザー定義関数として使っています。
しかし、エクセルの機能があまりに広いので、特別にほかに作る必要性がなかなか見つからないと思いますが、ニーズをかぎ分ける嗅覚を敏感にすると出てくるかもしれません(この方式があること自体考えたことがないというのが正直なところなのでないでしょうか。有効活用を本気になって考えてみれば宝の山…、かも知れません)。
2007年10月24日水曜日
第53回目 ちょっとした小物、罫線編-2
○第53回目 ちょっとした小物、罫線編-2
とんだところに北村大膳。
よほどのところに顔を出したのでしょうね。
思わぬ展開になって前回は長くなってしまいました。当初は今回分の合わせて、1回の予定でしたのですが…。
とんだところに、"冗長性"という事務屋にとって避けたい用語が出てきたので、捨て置けずに、踏み込んでしまいました。
操作マクロ関係は、機能だけでその内容など気にしていませんでしたので、捨て置きましたが、第53回の段階においてどうだといわれると、"美しくない"という気持ちが起きてしまい、つい寄道をしてしまいました。
続きを続けます。
今回は二つです。
1.罫線ダイアログを出す
2.五飛びに横罫線を引く
です。
1.はただ単に知っているかいないかという代物です。
命令は、
Application.Dialogs(xlDialogBorder).Show
だけです。
この構文では、( )の中が命になっています。
ではほかには何があるのでしょうか。
あんちょこによると、
xlDialogPageSetup 印刷・ページセットアップ
xlDialogSort ソート
xlDialogOpen ファイルを開く
xlDialogSaveAs 名前をつけて保存
xlDialogFormatNumber 文字表示書式
xlDialogAlignment 文字配置書式
xlDialogActiveCellFormat 文字フォント書式
xlDialogBorder 罫線設定
となっています。
漠然としていますので、何かで役立ててください、ということくらいのコメントでしょうか。
次に、五飛びの横罫線(縦罫線は実線で毎列に引く)です。
まず、五飛びの罫線の引きたい範囲を与えます。=⇒実行前に指定
そして、飛び数を与えます初期値は5としています。=⇒InputBox()関数で指定
前提条件としては、範囲の一番上及び一番下の罫線は実線で引きます、ということ。
次に、必ずしも一番下がぴったりするということではないということ。
また、既存で引かれている線をクリアしておくこと。
この3点が、気をつけたい点でしょうか。
手順を求めると、
1.範囲内の既存の線をクリアする
2.範囲の枠線を引く
3.範囲内の縦線を引く
4.五飛びの行を指定して横線を引く
設定範囲の座標の取得はいいですね。何事をするにも基本命令群です。
1.は、 selection.Borders.LineStyle = xlnone
2.は、 Selection.BorderAround LineStyle := xlContinuous
3.は、 Selection.Borders(xlInsideVertical).LineStyle = xlContinuous
4.は、最初の行がgyo1ですので、次に横線を引くのはgyo+5となります(5はパラメータで与えるので実際は変数となる)。これをgyo9を越える範囲で行なう、ということになります。
指定するセルの上に横線を引くという指定にします。
指定するセルは、
range(cells(gyo1+i-1,retu1),cells(gyo1+i-1,retu9)).select
となります(iは1から始まる)。
セルの上の線を引くのは、
Selection.Borders(xlEdgeTop).LineStyle = xlContinuous
となります。
for next文を使い、適切なところまで横線を引いていきます。
for next文の最後は、きっちりあわなくても大丈夫です。これを越えたらおしまいですという数値をあてがえばいいことになります。
このコントロールで、商を求める必要がありますが、
商は、(a \ 5) で求められます。
5行しかない時は、一回も線は引きません(上の線はすでに引かれています)。
6-10行の時は、一回だけ線を引きます。
11-14行の時は、二回だけ線を引きます。
後は、考えればマクロを組みことが出来ます。
もう少しヒントを…
指定範囲の行数は、gyo_cntです。
すると横線を引く回数は、(gyo_cnt-1)割る5の商となります。この間をiで動かします。
横線を引くセルの行数は、gyo1+i*5となります。
一瞬にして五飛びの線が引かれます。手作業でやっていた方にとっては感動ものです。
とんだところに北村大膳。
よほどのところに顔を出したのでしょうね。
思わぬ展開になって前回は長くなってしまいました。当初は今回分の合わせて、1回の予定でしたのですが…。
とんだところに、"冗長性"という事務屋にとって避けたい用語が出てきたので、捨て置けずに、踏み込んでしまいました。
操作マクロ関係は、機能だけでその内容など気にしていませんでしたので、捨て置きましたが、第53回の段階においてどうだといわれると、"美しくない"という気持ちが起きてしまい、つい寄道をしてしまいました。
続きを続けます。
今回は二つです。
1.罫線ダイアログを出す
2.五飛びに横罫線を引く
です。
1.はただ単に知っているかいないかという代物です。
命令は、
Application.Dialogs(xlDialogBorder).Show
だけです。
この構文では、( )の中が命になっています。
ではほかには何があるのでしょうか。
あんちょこによると、
xlDialogPageSetup 印刷・ページセットアップ
xlDialogSort ソート
xlDialogOpen ファイルを開く
xlDialogSaveAs 名前をつけて保存
xlDialogFormatNumber 文字表示書式
xlDialogAlignment 文字配置書式
xlDialogActiveCellFormat 文字フォント書式
xlDialogBorder 罫線設定
となっています。
漠然としていますので、何かで役立ててください、ということくらいのコメントでしょうか。
次に、五飛びの横罫線(縦罫線は実線で毎列に引く)です。

まず、五飛びの罫線の引きたい範囲を与えます。=⇒実行前に指定
そして、飛び数を与えます初期値は5としています。=⇒InputBox()関数で指定
前提条件としては、範囲の一番上及び一番下の罫線は実線で引きます、ということ。
次に、必ずしも一番下がぴったりするということではないということ。
また、既存で引かれている線をクリアしておくこと。
この3点が、気をつけたい点でしょうか。
手順を求めると、
1.範囲内の既存の線をクリアする
2.範囲の枠線を引く
3.範囲内の縦線を引く
4.五飛びの行を指定して横線を引く
設定範囲の座標の取得はいいですね。何事をするにも基本命令群です。
1.は、 selection.Borders.LineStyle = xlnone
2.は、 Selection.BorderAround LineStyle := xlContinuous
3.は、 Selection.Borders(xlInsideVertical).LineStyle = xlContinuous
4.は、最初の行がgyo1ですので、次に横線を引くのはgyo+5となります(5はパラメータで与えるので実際は変数となる)。これをgyo9を越える範囲で行なう、ということになります。
指定するセルの上に横線を引くという指定にします。
指定するセルは、
range(cells(gyo1+i-1,retu1),cells(gyo1+i-1,retu9)).select
となります(iは1から始まる)。
セルの上の線を引くのは、
Selection.Borders(xlEdgeTop).LineStyle = xlContinuous
となります。
for next文を使い、適切なところまで横線を引いていきます。
for next文の最後は、きっちりあわなくても大丈夫です。これを越えたらおしまいですという数値をあてがえばいいことになります。
このコントロールで、商を求める必要がありますが、
商は、(a \ 5) で求められます。
5行しかない時は、一回も線は引きません(上の線はすでに引かれています)。
6-10行の時は、一回だけ線を引きます。
11-14行の時は、二回だけ線を引きます。
後は、考えればマクロを組みことが出来ます。
もう少しヒントを…
指定範囲の行数は、gyo_cntです。
すると横線を引く回数は、(gyo_cnt-1)割る5の商となります。この間をiで動かします。
横線を引くセルの行数は、gyo1+i*5となります。
一瞬にして五飛びの線が引かれます。手作業でやっていた方にとっては感動ものです。
2007年10月20日土曜日
第52回目 ちょっとした小物、罫線編
○第52回目 ちょっとした小物、罫線編
これはすでに出てきているものですが、操作マクロであるために、整理して紹介はしてはいませんでしたので、罫線関係ということで紹介します。
エクセルの操作(データ入力ではありません)で何が一番よく使いますか。
その中にコピー関係、印刷関係はまずあがってくるでしょう。他にはどうでしょうか。
文字の表示関係と並んで罫線関係があるのではないでしょうか。
エクセルはまずは白紙の紙ですので、いつかの段階で罫線を引く必要が出てきます。
ということで、今回からは"罫線関係"です。
まず、多いのは無条件に罫線を引いてしまえということではないでしょうか(1.)。この反対として、無条件に消してしまえ(2.)というのも、人によっては頻度が多いのかもしれません。
罫線ダイアログを出す(3.)、というのはどうでしょうか。通常は、Ctrl+1のあとタブをたぐる、という操作になります。それを一気に表示させてしまおうというものです。
これからは個人のニーズいかんになってしまいますが、
4.五とびに横線を引く(五は一例。飛び飛びに引く機能)
5.細線の横線を引く
6.太線の枠線を引く
使われるものとしては、これくらいしか考えつきません。
5と6は、1と2と同様にマクロの記録をとれば(Alt+T+M+R)、完了ですので省略します。
1として、マクロの記録をとったもの(メインの部分)を次に掲げます。
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlInsideVertical)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlInsideHorizontal)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
ちょっと冗長的ですが、考えなしにできるのが、メリットです。
このマクロは1行指定の場合はエラーが出てしまいますが、気にせず終了させてください。
冗長的、ここまでこの連載を重ねた後では気になりますね。
あんちょこを見ていたら…
Range("A1:C5").Borders.LineStyle = xlContinuous
だけで、A1:C5に格子状に実線が引かれます。
Range("A1:C5").select
と範囲を指定して、
selection.Borders.LineStyle = xlContinuous
でも大丈夫です。
ばかばかしいほど省力化ができました。
※実行に当たってはSubとEnd Subで囲んでください。
全部削除は、
selection.Borders.LineStyle = xlnone
です。
操作マクロの記録より簡単なコマンドになりますので、5と6用の変数をまとめておきます。
細線(xlHairLine)
セル範囲内の横罫線(xlInsideHorizontal)
Selection.Borders(xlInsideHorizontal).Weight = xlHairLine
セル範囲内の縦罫線(xlInsideVertical)
例は省略
※普通の実線は、 Weight = xlThin となります。
中太線(xlMedium)
枠線(BorderAround)
Selection.BorderAround LineStyle := xlContinuous
Selection.BorderAround Weight = xlThick
太線(xlThick)
例は省略
これらを使った例です(範囲を指定してからの例になります)。
Sub Line_10()
Selection.Borders.LineStyle = xlContinuous
Selection.Borders(xlInsideHorizontal).Weight = xlHairline
Selection.BorderAround Weight:=xlThick
End Sub
実行すると、周りが太線、内部の横線が極細線、内部の縦線が普通の太さ(細線)となります。
※一般的に、指定していない部分はデフォルト値になりますのでその点は留意してください。
これはすでに出てきているものですが、操作マクロであるために、整理して紹介はしてはいませんでしたので、罫線関係ということで紹介します。
エクセルの操作(データ入力ではありません)で何が一番よく使いますか。
その中にコピー関係、印刷関係はまずあがってくるでしょう。他にはどうでしょうか。
文字の表示関係と並んで罫線関係があるのではないでしょうか。
エクセルはまずは白紙の紙ですので、いつかの段階で罫線を引く必要が出てきます。
ということで、今回からは"罫線関係"です。
まず、多いのは無条件に罫線を引いてしまえということではないでしょうか(1.)。この反対として、無条件に消してしまえ(2.)というのも、人によっては頻度が多いのかもしれません。
罫線ダイアログを出す(3.)、というのはどうでしょうか。通常は、Ctrl+1のあとタブをたぐる、という操作になります。それを一気に表示させてしまおうというものです。
これからは個人のニーズいかんになってしまいますが、
4.五とびに横線を引く(五は一例。飛び飛びに引く機能)
5.細線の横線を引く
6.太線の枠線を引く
使われるものとしては、これくらいしか考えつきません。
5と6は、1と2と同様にマクロの記録をとれば(Alt+T+M+R)、完了ですので省略します。
1として、マクロの記録をとったもの(メインの部分)を次に掲げます。
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlInsideVertical)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlInsideHorizontal)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
ちょっと冗長的ですが、考えなしにできるのが、メリットです。
このマクロは1行指定の場合はエラーが出てしまいますが、気にせず終了させてください。
冗長的、ここまでこの連載を重ねた後では気になりますね。
あんちょこを見ていたら…
Range("A1:C5").Borders.LineStyle = xlContinuous
だけで、A1:C5に格子状に実線が引かれます。
Range("A1:C5").select
と範囲を指定して、
selection.Borders.LineStyle = xlContinuous
でも大丈夫です。
ばかばかしいほど省力化ができました。
※実行に当たってはSubとEnd Subで囲んでください。
全部削除は、
selection.Borders.LineStyle = xlnone
です。
操作マクロの記録より簡単なコマンドになりますので、5と6用の変数をまとめておきます。
細線(xlHairLine)
セル範囲内の横罫線(xlInsideHorizontal)
Selection.Borders(xlInsideHorizontal).Weight = xlHairLine
セル範囲内の縦罫線(xlInsideVertical)
例は省略
※普通の実線は、 Weight = xlThin となります。
中太線(xlMedium)
枠線(BorderAround)
Selection.BorderAround LineStyle := xlContinuous
Selection.BorderAround Weight = xlThick
太線(xlThick)
例は省略
これらを使った例です(範囲を指定してからの例になります)。
Sub Line_10()
Selection.Borders.LineStyle = xlContinuous
Selection.Borders(xlInsideHorizontal).Weight = xlHairline
Selection.BorderAround Weight:=xlThick
End Sub
実行すると、周りが太線、内部の横線が極細線、内部の縦線が普通の太さ(細線)となります。
※一般的に、指定していない部分はデフォルト値になりますのでその点は留意してください。
2007年10月17日水曜日
第51回目 ちょっとした小物、計算式を文字化してコピー編
○第51回目 ちょっとした小物、計算式を文字化してコピー編
(休暇のため朝一番で掲載します)
通常とは違った計算式のコピーをします。これは前(第40回)にも出てきたものですが、結構利用価値があります。
なかなか一般的な類型としての使用例は浮かばないのですが、ちょっとした時便利さを感じます。
筆者がよく使う例は、計算式のチェックのときです。
単純なものはいいのですが、他のシートのものを使っているとか、計算が複雑な場合とか、計算式を分割してチェックすることがあります。その際に使います。
チェックしたいセルの下に6行ぐらい行を挿入します。そこにチェックしたい計算式を文字化したものを複数コピーします。
コピーした文字化された計算式を、複数に分割します。それを計算式化するのです。すると、使っている数値や中途経過がわかります。分割したものでチェックして、そこが正しければ、全体の計算式が正しいということになります。
ほかの例としては、単純にそのままコピーした方が、その後で修正しやすいといった場合でしょうか。通常コピーの場合、座標が動いてしまいます。
《マクロの例》
'範囲を指定して実行する。
'計算式のあるセルの計算式に特殊な記号を付加して文字化する
Dim CCC As Object
For Each CCC In Selection
If CCC.HasFormula = True Then
CCC = "xxx" & CCC.Formula
End If
Next
※逆の処理は、第40回を見てください(通常処理の置換え処理をもとにしたものです)。
※本日もその適用事例がありました。計算式を画面に出し、画面で見て、どこで区切ったら、チェックがスムーズにいくかと分析していると疲れてしまいましたので、文字化された式をコピーしテキストに移して印刷してから取り掛かりましたが、結果的にはそれのほうが早かったです。エクセルとテキストエディタの間の行き来がスムーズにいくともっといいなあという感想でした。
通常はAlt+tabで起動している画面の一覧を出して、それから選択するという操作をしますが、もっとスムーズなものがないでしょうか。研究したいと思います。
【作業手順】
1.チェックしたいセルの下に6行ぐらい行を挿入する。
2.エクセルで計算式を文字化する。文字化したものをCtrl+C
(テキストエディタに移動)
3.Ctrl+Vでテキストエディタに張り付ける。
4.テキストエディタの中で、式を分解・加工する。この段階で計算式にしてよい。
5.式をTABで結ぶ(=計算式1[TAB]=計算式2[TAB]=計算式3[TAB]=計算式4)。全体をCtrl+C。TABで結ぶのは、一括変換をすれば簡単です。改行をタブに変えればいいのです。
(エクセルに移動)
6.エクセルに戻って、計算式を入れたい場所でCtrl+Vし、計算式を張り付ける。各セルに計算式がコピーされます。
7.各パーツの計算式の結果をチェックする。
8.範囲指定をして該当する場所を印刷(これもマクロ化すると便利)して、記録として残す。
例
xxx=($EU17-P17-EC17)*((CW17-CV17)/(Q17-P17+CW17+EA17-EC17))*GE17
この計算式を、テキストエディタにはりつけ、チェック用に分解する。
=($EU17-P17-EC17)
=((CW17-CV17)/(Q17-P17+CW17+EA17-EC17))
=(CW17-CV17)
=(Q17-P17+CW17+EA17-EC17)
=GE17
これを、改行をTABに変換し、エクセルにコピーする。
=($EU17-P17-EC17)[TAB]=((CW17-CV17)/(Q17-P17+CW17+EA17-EC17))[TAB]=(CW17-CV17)[TAB]=(Q17-P17+CW17+EA17-EC17)[TAB]=GE17
すると、5つのセルに計算結果が表示される。
これを印刷するなりして、チェックする。
※エクセルの中ですべて行ってもかまいません。
※該当する箇所を範囲印刷する際に、改ページが挿入されている場所を含めた場合は、2ページに分かれて印刷されてしまいます。スマートではないので何とかならないのかと思っています
※この機能と前回の文字のコピーの機能を合体させて、計算式を文字化して、張り付けるという一連の処理にすることも考えられます。エクセル内で処理を行なう場合は、操作が少なくなりますので、これを目標としてマクロを作成したらどうでしょうか。
すでにコピーものと指定は終わっていますので、あとは貼付け先の指定と貼付けになります。さらに、最後に計算式化を入れて、元に戻すというのはどうでしょうか。
【手順】
(範囲を指定して実行する)
計算式のあるセルの計算式に特殊な記号を付加して文字化する
文字化したものをコピーする
貼付け先を指定し、張り付ける
元の場所に戻り、文字化したものを計算式に戻す。
このレベルになると、かなり便利になってきます。
(休暇のため朝一番で掲載します)
通常とは違った計算式のコピーをします。これは前(第40回)にも出てきたものですが、結構利用価値があります。
なかなか一般的な類型としての使用例は浮かばないのですが、ちょっとした時便利さを感じます。
筆者がよく使う例は、計算式のチェックのときです。
単純なものはいいのですが、他のシートのものを使っているとか、計算が複雑な場合とか、計算式を分割してチェックすることがあります。その際に使います。
チェックしたいセルの下に6行ぐらい行を挿入します。そこにチェックしたい計算式を文字化したものを複数コピーします。
コピーした文字化された計算式を、複数に分割します。それを計算式化するのです。すると、使っている数値や中途経過がわかります。分割したものでチェックして、そこが正しければ、全体の計算式が正しいということになります。
ほかの例としては、単純にそのままコピーした方が、その後で修正しやすいといった場合でしょうか。通常コピーの場合、座標が動いてしまいます。
《マクロの例》
'範囲を指定して実行する。
'計算式のあるセルの計算式に特殊な記号を付加して文字化する
Dim CCC As Object
For Each CCC In Selection
If CCC.HasFormula = True Then
CCC = "xxx" & CCC.Formula
End If
Next
※逆の処理は、第40回を見てください(通常処理の置換え処理をもとにしたものです)。
※本日もその適用事例がありました。計算式を画面に出し、画面で見て、どこで区切ったら、チェックがスムーズにいくかと分析していると疲れてしまいましたので、文字化された式をコピーしテキストに移して印刷してから取り掛かりましたが、結果的にはそれのほうが早かったです。エクセルとテキストエディタの間の行き来がスムーズにいくともっといいなあという感想でした。
通常はAlt+tabで起動している画面の一覧を出して、それから選択するという操作をしますが、もっとスムーズなものがないでしょうか。研究したいと思います。
【作業手順】
1.チェックしたいセルの下に6行ぐらい行を挿入する。
2.エクセルで計算式を文字化する。文字化したものをCtrl+C
(テキストエディタに移動)
3.Ctrl+Vでテキストエディタに張り付ける。
4.テキストエディタの中で、式を分解・加工する。この段階で計算式にしてよい。
5.式をTABで結ぶ(=計算式1[TAB]=計算式2[TAB]=計算式3[TAB]=計算式4)。全体をCtrl+C。TABで結ぶのは、一括変換をすれば簡単です。改行をタブに変えればいいのです。
(エクセルに移動)
6.エクセルに戻って、計算式を入れたい場所でCtrl+Vし、計算式を張り付ける。各セルに計算式がコピーされます。
7.各パーツの計算式の結果をチェックする。
8.範囲指定をして該当する場所を印刷(これもマクロ化すると便利)して、記録として残す。
例
xxx=($EU17-P17-EC17)*((CW17-CV17)/(Q17-P17+CW17+EA17-EC17))*GE17
この計算式を、テキストエディタにはりつけ、チェック用に分解する。
=($EU17-P17-EC17)
=((CW17-CV17)/(Q17-P17+CW17+EA17-EC17))
=(CW17-CV17)
=(Q17-P17+CW17+EA17-EC17)
=GE17
これを、改行をTABに変換し、エクセルにコピーする。
=($EU17-P17-EC17)[TAB]=((CW17-CV17)/(Q17-P17+CW17+EA17-EC17))[TAB]=(CW17-CV17)[TAB]=(Q17-P17+CW17+EA17-EC17)[TAB]=GE17
すると、5つのセルに計算結果が表示される。
これを印刷するなりして、チェックする。
※エクセルの中ですべて行ってもかまいません。
※該当する箇所を範囲印刷する際に、改ページが挿入されている場所を含めた場合は、2ページに分かれて印刷されてしまいます。スマートではないので何とかならないのかと思っています
※この機能と前回の文字のコピーの機能を合体させて、計算式を文字化して、張り付けるという一連の処理にすることも考えられます。エクセル内で処理を行なう場合は、操作が少なくなりますので、これを目標としてマクロを作成したらどうでしょうか。
すでにコピーものと指定は終わっていますので、あとは貼付け先の指定と貼付けになります。さらに、最後に計算式化を入れて、元に戻すというのはどうでしょうか。
【手順】
(範囲を指定して実行する)
計算式のあるセルの計算式に特殊な記号を付加して文字化する
文字化したものをコピーする
貼付け先を指定し、張り付ける
元の場所に戻り、文字化したものを計算式に戻す。
このレベルになると、かなり便利になってきます。
2007年10月13日土曜日
第50回目 ちょっとした小物、コピー編
○第50回目 ちょっとした小物、コピー編
データの編集作業でよく使うのがコピーです。コピーにもいろいろありますが何をよく使いますか。その上位から2、3をマクロ化するととても便利です。当然ショートカットキー化もします。
しかし、全面的なコピーは、すでにショートカットキーがなされているので、マクロ化は不要です。それ以外のもので有益なものを考えてください。
筆者の例でいえば、"計算式のコピー"と"値と数値の書式のコピー"です。これはかなり使用します。
通常の処理では、範囲を指定してCtrl+C、貼り付け場所にカーソルを移してAlt+E+Sのあとに上矢印キーを二回動かして計算式の貼付けを選択、エンターキーを押すということになります。
これを、範囲を指定しショートカットキーでマクロを呼び出し(最大でもCtrl+Shift+X)、張り付け場所にカーソルを移動しエンターキーとなります。上の場合とは、"Alt+E+Sをしそのあとに上矢印キーを二回動かして"というキー操作が不要となります(計算式・書式の張り付けの場合は、上矢印キーを三回動かしてとなります)。
これはお勧めです。
処理を分解しますと、
指定座標の取得=⇒今まで結構出てきている基本処理
コピーの処理=⇒マクロの記録で把握
コピー先の座標の指定=⇒これも定番の処理
張り付けの処理=⇒マクロの記録で把握
となります。
座標はコピー元、張り付け先とも、一つのセル及び範囲セルの可能性があります。
これを分け、別々に作成するのはめんどくさいので、一つにまとめます。
'指定範囲の取得
AAA = Selection.Address
p1 = InStr(AAA, ":")
If p1 <> 0 Then
AAA1 = Left(AAA, p1 - 1)
retu1 = Range(AAA1).Column
gyo1 = Range(AAA1).Row
AAA9 = Mid(AAA, p1 + 1)
retu9 = Range(AAA9).Column
gyo9 = Range(AAA9).Row
Else
AAA1 = AAA
retu1 = Range(AAA1).Column
gyo1 = Range(AAA1).Row
AAA9 = AAA1
retu9 = retu1
gyo9 = gyo1
End If
gyo_cnt = gyo9 - gyo1 + 1
retu_cnt = retu9 - retu1 + 1
すべての場合に同じものを使うのは、多少無駄があるのですが、大体の処理はこれ一つでできますので、便利な道具となります。
次は、張り付け先の座標の指定です
Set セル範囲 = Application.InputBox(Prompt:="貼り付けるセル範囲を選択してください", Default:=XXX, Left:=10, Top:=2, Type:=8)
AAA2 = セル範囲.Address
※Default値は必要な場合のみ。
Dim セル範囲 As Range の定義が必要
最後は、コピー処理です("値と数値の書式"の場合)。
Range(AAA).Copy 'AAAはコピーもとの座標
Range(AAA2).PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
xlNone, SkipBlanks:=False, Transpose:=False 'AAA2は張り付け先の座標
Application.CutCopyMode = False 'コピー選択を解除
これを組み立てて、ショートカットキーを当てはめれば完了です。
※筆者はこれにシートの移動機能を付加したものも使用しています。シートを越えてもコピーが出来るという売りです。デフォルト値として同一シートを指定していますので、同一シートへのコピーの場合は、最小限としてエンターキーが1回余計に必要となります。シートをかえる場合は、シート番号の入力が更に必要となります。
どちらを常用するかは、使う人の感覚ですね。(エンターキーの操作が余計になります)
データの編集作業でよく使うのがコピーです。コピーにもいろいろありますが何をよく使いますか。その上位から2、3をマクロ化するととても便利です。当然ショートカットキー化もします。
しかし、全面的なコピーは、すでにショートカットキーがなされているので、マクロ化は不要です。それ以外のもので有益なものを考えてください。
筆者の例でいえば、"計算式のコピー"と"値と数値の書式のコピー"です。これはかなり使用します。
通常の処理では、範囲を指定してCtrl+C、貼り付け場所にカーソルを移してAlt+E+Sのあとに上矢印キーを二回動かして計算式の貼付けを選択、エンターキーを押すということになります。
これを、範囲を指定しショートカットキーでマクロを呼び出し(最大でもCtrl+Shift+X)、張り付け場所にカーソルを移動しエンターキーとなります。上の場合とは、"Alt+E+Sをしそのあとに上矢印キーを二回動かして"というキー操作が不要となります(計算式・書式の張り付けの場合は、上矢印キーを三回動かしてとなります)。
これはお勧めです。
処理を分解しますと、
指定座標の取得=⇒今まで結構出てきている基本処理
コピーの処理=⇒マクロの記録で把握
コピー先の座標の指定=⇒これも定番の処理
張り付けの処理=⇒マクロの記録で把握
となります。
座標はコピー元、張り付け先とも、一つのセル及び範囲セルの可能性があります。
これを分け、別々に作成するのはめんどくさいので、一つにまとめます。
'指定範囲の取得
AAA = Selection.Address
p1 = InStr(AAA, ":")
If p1 <> 0 Then
AAA1 = Left(AAA, p1 - 1)
retu1 = Range(AAA1).Column
gyo1 = Range(AAA1).Row
AAA9 = Mid(AAA, p1 + 1)
retu9 = Range(AAA9).Column
gyo9 = Range(AAA9).Row
Else
AAA1 = AAA
retu1 = Range(AAA1).Column
gyo1 = Range(AAA1).Row
AAA9 = AAA1
retu9 = retu1
gyo9 = gyo1
End If
gyo_cnt = gyo9 - gyo1 + 1
retu_cnt = retu9 - retu1 + 1
すべての場合に同じものを使うのは、多少無駄があるのですが、大体の処理はこれ一つでできますので、便利な道具となります。
次は、張り付け先の座標の指定です
Set セル範囲 = Application.InputBox(Prompt:="貼り付けるセル範囲を選択してください", Default:=XXX, Left:=10, Top:=2, Type:=8)
AAA2 = セル範囲.Address
※Default値は必要な場合のみ。
Dim セル範囲 As Range の定義が必要
最後は、コピー処理です("値と数値の書式"の場合)。
Range(AAA).Copy 'AAAはコピーもとの座標
Range(AAA2).PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
xlNone, SkipBlanks:=False, Transpose:=False 'AAA2は張り付け先の座標
Application.CutCopyMode = False 'コピー選択を解除
これを組み立てて、ショートカットキーを当てはめれば完了です。
※筆者はこれにシートの移動機能を付加したものも使用しています。シートを越えてもコピーが出来るという売りです。デフォルト値として同一シートを指定していますので、同一シートへのコピーの場合は、最小限としてエンターキーが1回余計に必要となります。シートをかえる場合は、シート番号の入力が更に必要となります。
どちらを常用するかは、使う人の感覚ですね。(エンターキーの操作が余計になります)
登録:
コメント (Atom)
