Excelでグラフの縦横軸を統一するマクロ作成方法

このQ&Aのポイント
  • Excelで選択したグラフの大きさや縦横軸を統一するマクロの作成方法について説明します。
  • マクロを使用して、選択したグラフの初期設定値をダイアログの入力欄に表示させる方法についても解説します。
  • ExcelのVBAを使って、選択したグラフの縦横軸の最小値と最大値を設定する方法について詳しく説明します。
回答を見る
  • ベストアンサー

現在、エクセルで、選択したグラフの大きさや縦横軸を統一するマクロを作成

現在、エクセルで、選択したグラフの大きさや縦横軸を統一するマクロを作成中です。 以下のようなマクロまでは作ることができましたが、ひとつだけ不満があります。 それは、初期値です。 できれば、最初に選択したグラフの設定を初期としてダイアログの入力欄に記入してある状態にしたいのですが、どうすればよいかわかりません。 知恵を貸してください!! よろしくお願いいたします!!! Sub 選択したグラフ縦横軸変更() Dim chartObj As ChartObject Dim myObj As Object Dim xmin As Double Dim xmax As Double Dim ymin As Double Dim ymax As Double xmin = Application.InputBox("x軸最小値") xmax = Application.InputBox("x軸最大値") ymin = Application.InputBox("y軸最小値") ymax = Application.InputBox("y軸最大値") For Each myObj In Selection Set chartObj = ActiveSheet.ChartObjects(myObj.Name) With chartObj.Chart.Axes(xlCategory) .MaximumScale = xmax .MinimumScale = xmin End With With chartObj.Chart.Axes(xlValue) .MaximumScale = ymax .MinimumScale = ymin End With Next myObj End Sub

質問者が選んだベストアンサー

  • ベストアンサー
  • end-u
  • ベストアンサー率79% (496/625)
回答No.1

Sub try()   Dim objs As Object   Dim obj As Object   Dim flg As Boolean   Dim xmin As Double   Dim xmax As Double   Dim ymin As Double   Dim ymax As Double   If TypeName(Selection) <> "DrawingObjects" Then     MsgBox "failure"     Exit Sub   End If   Set objs = Selection   For Each obj In objs     If TypeName(obj) = "ChartObject" Then       flg = True       With obj.Chart         With .Axes(xlCategory)           xmin = .MinimumScale           xmax = .MaximumScale         End With         With .Axes(xlValue)           ymin = .MinimumScale           ymax = .MaximumScale         End With       End With       Exit For     End If   Next   If flg Then     xmin = Application.InputBox("x軸最小値", , xmin)     xmax = Application.InputBox("x軸最大値", , xmax)     ymin = Application.InputBox("y軸最小値", , ymin)     ymax = Application.InputBox("y軸最大値", , ymax)     For Each obj In objs       If TypeName(obj) = "ChartObject" Then         With obj.Chart           With .Axes(xlCategory)             .MinimumScale = xmin             .MaximumScale = xmax           End With           With .Axes(xlValue)             .MinimumScale = ymin             .MaximumScale = ymax           End With         End With       End If     Next   End If   Set objs = Nothing End Sub こんな感じです。 2003以前と2007でちょっと挙動が違って、 2003では上記try実行した後、Selctionのまま再実行すると 最初に選択したChartがわからなくなるようです。 単独で実行する分には問題ないでしょう。

shinoda
質問者

お礼

ありがとうございます!!これで効率化します!!

関連するQ&A

  • エクセルの1シート内にある複数の散布図のx軸とy軸の最大目盛、最少目盛

    エクセルの1シート内にある複数の散布図のx軸とy軸の最大目盛、最少目盛、目盛間隔を揃えるにはどのようにしたら良いか教えてください。いくつかwebsiteで調べて下記のようにしてみましたが、x軸の目盛を変更するところで、失敗してしまいます。 よろしくお願いします。 Sub XY軸() Dim Ymin Ymin = InputBox("Y軸の最少?") If IsNumeric(Ymin) Then Range("C2").Value = Ymin Else MsgBox "入力NG!" End If Dim Ymax Ymax = InputBox("Y軸の最大?") If IsNumeric(Ymax) Then Range("C3").Value = Ymax Else MsgBox "入力NG!" End If Dim Y Y = InputBox("目盛間隔?") If IsNumeric(Y) Then Range("C4").Value = Y Else MsgBox "入力NG!" End If Dim xmin xmin = InputBox("X軸の最少?") If IsNumeric(xmin) Then Range("D2").Value = xmin Else MsgBox "入力NG!" End If Dim Xmax Xmax = InputBox("X軸の最大?") If IsNumeric(Xmax) Then Range("D3").Value = Xmax Else MsgBox "入力NG!" End If Dim X X = InputBox("Xの目盛間隔?") If IsNumeric(X) Then Range("D4").Value = X Else MsgBox "入力NG!" End If Dim co As ChartObject For Each co In ActiveSheet.ChartObjects With co.Chart With .Axes(xlValue) .MinimumScale = Range("C2").Value '最小値 .MaximumScale = Range("C3").Value '最大値 .MajorUnit = Range("C4") '目盛間隔 End With With .Axes(xlCategory) .MinimumScale = Range("D2").Value '最小値 .MaximumScale = Range("D3").Value '最大値 .MajorUnit = Range("D4") '目盛間隔 End With End With Next End Sub

  • MATLABで画像軸のスケール変更をしたいのですが、 スケールだけのへ

    MATLABで画像軸のスケール変更をしたいのですが、 スケールだけのへんこうはできますか? axis ([xmin xmax ymin ymax])だと画像サイズを超えた際に余白が白くなってしまいます。 画像サイズはそのままで縮尺サイズだけ変更したいです。 どなたかお願いします

  • ビットマップを二値化した後の座標取得のご相談

    ビットマップを二値化した後の座標取得のご相談 最近VB6.0からVC++2008(Express Edition)に乗り換えて画像処理を試みています(WinXP).現在,長方形が写っているビットマップ画像を二値化して,指定範囲内の長方形の平均高さ(白を抽出)を調べようとしています.WEBや文献など調べて,二値化するところまではできたのですが,二値化後の白黒画像の座標値の読み方が分からないため,長方形の高さを算出することができません.もしよろしければご助言いただけましたら幸いに思います. ─────────────────────────────────── VB6.0プログラム(二値化後の処理の部分) Dim Xmin As Double, Xmax As Double //X方向 Dim Ymin As Double, Ymax As Double //Y方向 Dim SumY As Double, AveY As Double Dim Pix As Double ' Xmin = 0 Xmax = Shape1.Width SumY = 0  //長方形の高さの合計 AveY = 0  //長方形の高さの平均 ' For X = Shape1.Left To Shape1.Left + Shape1.Width Ymin = 0 Ymax = 0 ' For Y = Shape1.Top To Shape1.Top + Shape1.Height //囲んだ四角部分において '   //※この下の部分をVC++2008でどのようにすれはいいかわかりません・・・ If picturebox1.Point(X, Y) = RGB(255, 255, 255) Then //白があれば If Ymin = 0 Then //Yminが0であれば Ymin = Y //YminはY End If If Ymax < Y Then //YmaxがYより小さかったら Ymax = Y //YmaxはY End If End If ' Next Y SumY = SumY + Ymax - Ymin //Xごとの長方形の高さの合計 Next X ' AveY = SumY / Xmax //平均高さの算出 ─────────────────────────────────── ここからVC++2008(二値化と計算を一気に行えればいいなと思ってます) for (j = 0; j < rect.Height; j++) {  for (i = 0; i < rect.Width; i++){ //輝度値の取得 B = pBuf[i * Step + j * bmpData->Stride]; //青 G = pBuf[i * Step + 1 + j * bmpData->Stride]; //緑 R = pBuf[i * Step + 2 + j * bmpData->Stride]; //赤 //輝度値の設定(二値化) if ((B >= Threshold) || (G >= Threshold) || (R >= Threshold)) { //白に変換  pBuf[i * Step + j * bmpData->Stride] = 255; //青  pBuf[i * Step + 1 + j * bmpData->Stride] = 255; //緑  pBuf[i * Step + 2 + j * bmpData->Stride] = 255; //赤  //※ここに何かいれればいいと思うのですが,上記の  //※If(picturebox1.Point(X,Y)=RGB(255,255,255))に代わる書き方が分かりません… } else { //黒に変換 pBuf[i * Step + j * bmpData->Stride] = 0; //青 pBuf[i * Step + 1 + j * bmpData->Stride] = 0; //緑 pBuf[i * Step + 2 + j * bmpData->Stride] = 0; //赤 } } 参照WEB http://imagingsolution.blog107.fc2.com/blog-entry-40.htm

  • 任意にデータの範囲を選択し、グラフを描画したい

    質問を閲覧していただきありがとうございます。 できればみなさんのお力を貸していただきたいことがあり、質問しました。 以下にマクロ作成に用いたプログラムの仕様とコードを貼りますので、ご指摘等いただけましたら幸いです。 まず、今回のマクロの目的は ・既に存在するエクセルデータから、x軸、y軸のデータ列の長さに応じたグラフを描画するVBプログラムを書く事 です。 ・可能ならば、既存のふたつのグラフを結合したものを新しく表示する ※データシートの画像は添付しましたのでご覧ください。 以上のふたつとなります。 理想形としては、 A2 ~ A1025までをx軸のデータ、B2~B1025までの実データ値としたグラフAを一つ D2 ~ E1025までをx軸のデータ、E2~E1025までの実データ値としたグラフBを一つ 上記二つのグラフを結合したグラフを一つ の3つのグラフが自動的に作成され、エクセルファイル上に表示されている といったような感じです。 私の書いたコードの問題点としては、 ・グラフAグラフBともに「x軸と実データが正しく対応していない」 →本来両方のグラフにおいてはグラフの右端まで折れ線グラフが続いているはずですが、x軸の値にして約1000の所でデータが終わってしまっています。 ・グラフBでは、D2 ~ D344, E2 ~ E344 を基にしたグラフ一つのみが描画されているはずですが、ここには何故か二つ以上の折れ線グラフがあるようにみえ、グラフB右には系列1~5までがあるように書かれています。(理想としては5個ではなく実データを示すもの一つのみ) ・ふたつのグラフの結合方法が不明 という感じです。 以下にプログラムを貼ります。 お時間ありましたら、ご指摘の程宜しくお願い致します。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Sub グラフ描画() chart_title1 = "グラフA" chart_title2 = "グラフB" '軸のタイトル x_title = "周波数[Hz]" y_title = "パワー" ' -------------------------グラフ作成---------------------- ' グラフを描画 Dim chartObj1 As ChartObject Set chartObj1 = ActiveSheet.ChartObjects.Add(1, 1, 300, 200) With chartObj1.Chart ' データ範囲をセット .SetSourceData Source:=Range(Range("B2"), _ Cells(2, 1).End(xlDown)) ' x軸の項目軸範囲をセット .SeriesCollection(1).XValues = Range(Range("A2"), _ Cells(1, 1).End(xlDown)) ' オプションをセット .ChartType = xlXYScatterSmoothNoMarkers ' 散布図 .HasTitle = True .ChartTitle.Characters.Text = chart_title .Axes(xlCategory, xlPrimary).HasTitle = True .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = x_title .Axes(xlValue, xlPrimary).HasTitle = True .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = y_title ' x軸の最大値、最小値設定 .Axes(xlCategory, xlPrimary).MinimumScale = 0 .Axes(xlCategory, xlPrimary).MaximumScale = 4500 ' y軸の最大値、最小値設定 .Axes(xlValue).MinimumScale = -10 .Axes(xlValue).MaximumScale = 3 End With Dim chartObj2 As ChartObject Set chartObj2 = ActiveSheet.ChartObjects.Add(1, 320, 300, 200) With chartObj2.Chart ' データ範囲をセット .SetSourceData Source:=Range(Range("E2"), _ Cells(2, 1).End(xlDown)) ' x軸の項目軸範囲をセット .SeriesCollection(1).XValues = Range(Range("D2"), _ Cells(1, 1).End(xlDown)) ' オプションをセット .ChartType = xlXYScatterSmoothNoMarkers ' 散布図 .HasTitle = True .ChartTitle.Characters.Text = chart_title .Axes(xlCategory, xlPrimary).HasTitle = True .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = x_title .Axes(xlValue, xlPrimary).HasTitle = True .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = y_title ' x軸の最大値、最小値設定 .Axes(xlCategory, xlPrimary).MinimumScale = 0 .Axes(xlCategory, xlPrimary).MaximumScale = 4500 ' y軸の最大値、最小値設定 .Axes(xlValue).MinimumScale = -10 .Axes(xlValue).MaximumScale = 3 End With End Sub ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

  • エクセルのマクロでアクティブシート内の選択した複数のグラフのみ軸の目盛を変更

    エクセルのマクロで教えてください。20個のグラフを一つのシートに作成しますが、この20個の散布図グラフの中から、クリックして選択したグラフだけ、y軸の目盛を自動スケールで最大値、最少値、目盛間隔の分割数は5個に自動にできないでしょうか? いくつか質問サイトを調べて、以下でアクティブシートのすべてのグラフ(20個)をセルに入力された値に一括で変更することはできるのですが、クリックして選択したグラフだけ、上記のようにできません。よろしくお願いします。 Sub 全部() Dim co As ChartObject For Each co In ActiveSheet.ChartObjects With co.Chart With .Axes(xlValue) .MinimumScale = Range("A1").Value '最小値 .MaximumScale = Range("A2").Value '最大値 .MajorUnit = Sheets("Sheet1").Range("A3") '目盛間隔 End With End With Next End Sub

  • エクセルのマクロで教えてください。仕事で、種類の異なる20個のグラフを

    エクセルのマクロで教えてください。仕事で、種類の異なる20個のグラフを一つのシートに作成しますが、2個だけ内容が異なるグラフになってします この20個の散布図グラフで、クリックして選択したグラフだけ、y軸の目盛を自動スケールで最大値、最少値、目盛間隔の分割数は5個に自動にできないでしょうか? このサイトなどいくつか調べて、以下でアクティブシートのすべてのグラフ(20個)をセルに入力された値に一括で変更することはできるのですが、クリックして選択したグラフだけ、上記のようにできません。よろしくお願いします。 Sub 全部() Dim co As ChartObject For Each co In ActiveSheet.ChartObjects With co.Chart With .Axes(xlValue) .MinimumScale = Range("A1").Value '最小値 .MaximumScale = Range("A2").Value '最大値 .MajorUnit = Sheets("Sheet1").Range("A3") '目盛間隔 End With End With Next End Sub

  • Scilabを使ったジュリア集合の描画プログラム

    今、Scilabを使用してジュリア集合(充填およびそれ以外を含む集合)を描画するプログラムを書いています。 以前書いたC言語のプログラムをもとに書いているのですが、正確に描画できません。どうしたらよいでしょうか。教えてください。 与える条件は右上と左下の座標(複素数形式)と定数Cの値です。 以下に掲載したのが製作したプログラムです。 よろしくお願い致します。 //描画エリアの右上と左下の座標を複素数で設定する Z =[ -1.2-1.2*%i;1.2+1.2*%i]; //複素定数(C)を設定する C=0+0*%i; //描画エリアのx座標とy座標の各最小値と最大値を計算する。 xmin = min(real(Z)); xmax = max(real(Z)); ymin = min(imag(Z)); ymax = max(imag(Z)); Cr = real(C); Ci = imag(C); //描画点数を800×800に設定する。 N = 800; //各増分を計算する。 dx = (xmax-xmin)/(N-1); dy = (ymax-ymin)/(1-N); //プロットデータを"0"で初期化 map=zeros(N,N); //ジュリア集合の描画 i=1; for X=xmin:dx:xmax j=1; for Y=ymax:dy:ymin for k=1:30 x = X ^ 2 - Y ^ 2 + Cr; y = 2 * X * Y +Ci; if x^2 +y^2 > 4 then break; end map(j,i)=k; X=x; Y=y; end j=j+1; end i=i+1; end //プロットするための設定 Re = xmin:dx:xmax; Im = ymax:dy:ymin; clf(0); Sgrayplot(Re,Im,map');

  • (C言語)スキャンライン法による三角形作成

    こんにちは! 先週C言語のプログラミングの課題が出て土日もずっと考えたのですが全く意味が分かりません>< どなたか教えてください泣 内容は、スキャンライン法で二次元三角形を作り(三角形の塗りつぶし)、BMPファイルへ出力せよというものです。 1. 3角形を囲む長方形・ (xmin,xmax,ymin,ymax) 2. Y座標をymax~yminまで, 1ずつ減らしながら以下を繰り返す (a)スキャンラインSL(Y=y)発生 (b)SLと3角形との交点(線形補間) (c)交点間の画素を 表示色(r,g,b)で塗る *端点や水平線に注意 よろしくお願いします><

  • マクロ 任意の日付のセルを選択する方法

    いつも回答して頂きありがとうございます。 インプットボックスを使用して、任意の日付の期間を選択する方法がさっぱり分かりません。御指導の程宜しくお願い致します。あと、この記述方法では、『If Not ?? Is Nothing Then』がいるのでしょうか? シートの詳細 ・B4から下方向に日付が連番で記載されている。 Sub 範囲の選択() Dim Date1 As Date Dim Date2 As Date Dim b1 As Variant Dim b2 As Variant Date1 = Application.InputBox("最初の日付を2012/11/1のように入力してください。") Date2 = Application.InputBox("最後の日付を2012/11/31のように入力してください。") With Worksheets("集計用") Set b1 = .Columns("B").Find("Date1", , xlValues, 1) Set b2 = .Columns("B").Find("Date2", , xlValues, 1) .Range(b1, b2).Select End With End Sub

  • ExcelのVBAで、application.inputboxで、開いている他のブックを選択できません。

    いつもお世話になっております。 ExcelのVBAで、application.inputboxで他のブックを選択したいのですが、どうも出来ません。下記のコードを実行して、InputBoxで、他のブックのセルを指定したいのですが、どうも現在開いている他のブックをマウスでクリック出来ないのです。 下記のコードは、『選択範囲を、InputBoxで指定した先にコピーしたい』という意図から、まずは、Msgboxに表示してみることにしたものです。 これは、何故なのでしょうか? ご教示下さい。 'rngOriginalを、rngCopyToにコピーします。 Sub Test() Dim rngOriginal As Range Dim rngCopyTo As Range Set rngOriginal = Selection.Cells  Set rngCopyTo = Application.InputBox("コピー先を選択してください", , , , , , , 8) With rngOriginal MsgBox .Parent.Parent.Name & " " & .Parent.Name & "!" & .Address(, , Application.ReferenceStyle) End With With rngCopyTo MsgBox .Parent.Parent.Name & " " & .Parent.Name & "!" & .Address(, , Application.ReferenceStyle) End With End Sub

専門家に質問してみよう