Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


2358 / 13644 ツリー ←次へ | 前へ→

【68500】教えてください hige 11/3/11(金) 8:55 質問[未読]
【68501】Re:教えてください kanabun 11/3/11(金) 9:39 発言[未読]
【68513】Re:教えてください hige 11/3/12(土) 23:05 お礼[未読]
【68515】Re:教えてください kanabun 11/3/13(日) 0:50 発言[未読]
【68518】Re:教えてください hige 11/3/13(日) 12:43 お礼[未読]
【68502】Re:教えてください Yuki 11/3/11(金) 10:08 発言[未読]
【68514】Re:教えてください hige 11/3/12(土) 23:08 お礼[未読]

【68500】教えてください
質問  hige  - 11/3/11(金) 8:55 -

引用なし
パスワード
   初心者なので、よろしくお願いします。

  A   B
1  1  50
2  2  63
3  3  54
4  4  98
5  5  23

このようにマクロで別のシートから数字を抜き出してきました。A列に番号を、B列にデータを並べたわけです。これからB列の最大数を調べて、それに対応する横(A列)の番号を変数に入れたいのです。いろいろと自分なりに考えてやってみたのですが、無理みたいです。よろしくお願いします。

【68501】Re:教えてください
発言  kanabun  - 11/3/11(金) 9:39 -

引用なし
パスワード
   ▼hige さん:

> B列の最大数を調べて、それに対応する横(A列)の番号を変数に入れたい

たまには 数式で...

Sub Try1()
  Dim r As Range
  Dim n As Long
  
  Set r = Range("A1").CurrentRegion.Columns(2)
  '最大値のあるセルの相対行番号を求める
  With WorksheetFunction
    n = .Match(.Max(r), r, 0)
  End With
  Application.Goto r.Cells(n, 0)
  MsgBox "このセルです =" & r.Cells(n, 0).Value 'A列の番号
  
End Sub

【68502】Re:教えてください
発言  Yuki  - 11/3/11(金) 10:08 -

引用なし
パスワード
   ▼hige さん:
こんにちは。
A列の値を返します。
Dim ret As Long
With WorksheetFunction
  ret = .Index(Range("A:A"), .Match(.Max(Range("B:B")), Range("B:B"), 0))
End With

【68513】Re:教えてください
お礼  hige  - 11/3/12(土) 23:05 -

引用なし
パスワード
   ▼kanabun さん:
ありがとうございました。助かります・・・

ずうずうしく、もう一つ教えていただきたいのですが、
グラフの作成で、

Charts.Add
  ActiveChart.ChartType = xlLine
  ActiveChart.SetSourceData Source:=***, PlotBy:=xlColumns

のような感じでVBAを記録しますよね。このデータ範囲の***のところに、

Range(Cells(n,1),Cells(n+10,2))

のように、Cells を使うとエラーになるみたいなのですが、どうすれば良いのでしょうか?

よろしくお願いします。

【68514】Re:教えてください
お礼  hige  - 11/3/12(土) 23:08 -

引用なし
パスワード
   ▼Yuki さん:
ありがとうございました。
参考にさせてもらいました。

【68515】Re:教えてください
発言  kanabun  - 11/3/13(日) 0:50 -

引用なし
パスワード
   ▼hige さん:
> グラフの作成で、
>
>   Charts.Add
>   ActiveChart.ChartType = xlLine
>   ActiveChart.SetSourceData Source:=***, PlotBy:=xlColumns
>
> のような感じでVBAを記録しますよね。このデータ範囲の***のところに、
>
> Range(Cells(n,1),Cells(n+10,2))
>
> のように、Cells を使うとエラーになるみたいなのですが、
> どうすれば良いのでしょうか?

【事実1】標準モジュールで、Rangeとか Cells とかの親(シート)を
 省略すると、ActiveSheet が省略されたものと解釈されます。
> Range(Cells(n,1),Cells(n+10,2))
 は、(省略しないで書くと)
  ActiveSheet.Range( _
      ActiveSheet.Cells(n,1), _
      ActiveSheet.Cells(n+10,2))
ということなのです。

【事実2】 Excelオブジェクトには2つの種類のSheetがあります。
  1つ目は Worksheet (ワークシート)
  2つ目は Chart(グラフシート)です。

【事実3】Excelグラフには2つの種類のグラフがあります。
 1つ目は「グラフシート」のグラフ Chart です。
   Chart(グラフシートのこと)を作る命令は Charts.Add です。
 もう一つは「ワークシート」上の埋め込みグラフChartObject です。
  埋め込みグラフを作る命令は ActiveSheet.ChartObjects.Add です。

 ところが、Worksheet上に埋め込みグラフを作るばあいでも、
 「グラフウィザード」を使って作成すると、マクロ記録にあるように
 グラフシートを作ってから、描画し、それを元のワークシートに移動
 するという <2 Step>処理をして作っています。
 
以上のことから、
>   Charts.Add
>   ActiveChart.SetSourceData _
>     Source:=Range(Cells(n,1),Cells(n+10,2))
が、
なぜエラーになるのかを説明すると、
まず
>   Charts.Add
  →で、新規にグラフシートを作ります
   このとき「アクティブなシート」は
   今作ったChart(グラフシート)を指しています。

つぎに、
>   ActiveChart.SetSourceData _
>     Source:=Range(Cells(n,1),Cells(n+10,2))
 この構文の意味は
 《ActiveChart(グラフシートのグラフ)に、
   Range(Cells(n,1),Cells(n+10,2))という範囲をSetせよ》
 ということで、
 【事実2】より いまアクティブなシートはActiveChartですから
 【事実1】より RangeとCellsのまえに省略されている「今アクティブ
  になっている親シート(すなわちActiveChart)を省略しないで
  記述すると、この1行は こうなります。
>   ActiveChart.SetSourceData Source:= _
>     ActiveChart.Range( _
>       ActiveChart.Cells(n,1),ActiveChart.Cells(n+10,2))
このように、省略されているシートを明示的に書き出してみると、
《アクティブなシートであるActiveChartのセル(n,1)〜セル(n+10,2)の
範囲を元データ範囲とせよ》と命令していることになり、ActiveChart
には Cellsとか Range なんて無いので、エラーになります。

マクロ記録をそのまま実行してもエラーにならないのは
>>   Charts.Add
>>   ActiveChart.SetSourceData _
>>     Source:=Sheets("Sheet1").Range("A2:B12")
のように、Rangeのまえに明示的にシートが修飾されているからですね。

それと同じように、
>   ActiveChart.SetSourceData _
>     Source:=Sheets("Sheet1").Range( _
>       Sheets("Sheet1").Cells(n,1),Sheets("Sheet1").Cells(n+10,2))
のように記述すれば、エラーにはならないはずです。

(↑だと、コードが長く、また読みにくくなるので)
通常は元データ範囲をあらわすRange型の変数をひとつ用意しておいて
Dim SrcRange As Range
With Worksheets("Sheet1")
  Set SrcRange = .Range((.Cells(n,1), .Cells(n+10,2))
End With
としておいてから、グラフを作成します。
>   Charts.Add
>   ActiveChart.SetSourceData Source:=SrcRange, PlotBy:=xlColumns
のように。

また、
Sheet1上に、埋め込みグラフを作成なら、
Dim SrcRange As Range
With Worksheets("Sheet1")
  Set SrcRange = .Range((.Cells(n,1), .Cells(n+10,2))
  With .ChartObjects.Add(左, 上, 幅, 高さ).Chart
    .ChartType = xlLine
    .SetSourceData SrcRange, xlColumns
  End With
End With

とすれば、埋め込みグラフをおく場所とサイズを合わせて指定して
グラフが作成できます。

【68518】Re:教えてください
お礼  hige  - 11/3/13(日) 12:43 -

引用なし
パスワード
   ▼kanabun さん:
グラフの作成も出来るようになりました。本を買ってきて悪戦苦闘してやっても解決できずにいましたが、おかげさまで作業がはかどりました。
ありがとうございました。

2358 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free