Excel vba をはじめて1ヵ月程度の初心者ですが、すいません質問させて下さい。
動的配列というのでしょうか?
その配列の中の最大値を求めたいのですが、よくわかりません。
アクティブシート内の図形で最前面以外の図形を消去しようと思ってます。
マクロで最大値の取得ができないので、暫定的にシートに計算させてしまっているのですが、マクロ上で最大値を求める方法がわかりません。

Sub testSZ()

Dim Num As Integer, Sum As Integer, Shp As Shape, Ary() As Variant, Mxm As Long

'++++++++++↓アクティブシート内の図形をカウント:=Sum
Sum = 0
For Each Shp In ActiveSheet.Shapes
Sum = Sum + 1
Next Shp

'++++++++++↓配列の数を決定
ReDim Ary(1, Sum)

'++++++++++↓配列に図形と図形のZオーダーを設定
Num = 0
For Each Shp In ActiveSheet.Shapes
Shp.Select
Set Ary(0, Num) = Shp
Ary(1, Num) = Selection.ShapeRange.ZOrderPosition
Num = Num + 1
Next Shp

'++++++++++↓配列内のZオーダー最大値を取得
Mxm = Application.WorksheetFunction.Max

'++++++++++↓最前面の図形以外を消去
Num = 0
Do
If Mxm > Ary(1, Num) Then
Ary(0, Num).Delete
End If
Num = Num + 1
Loop Until Sum = Num

Erase Shp

End Sub

Application.WorksheetFunction.Max[]
の[]にAryやAry(1,Num)をやってみたりしたのですが、
できないです。

どなたか御教授おねがい致します!!

このQ&Aに関連する最新のQ&A

A 回答 (5件)

配列内の最大値などを求めるのは、通常は、全体をなめるしかないと思いますが、ご質問のケースですと、記録するときに同時に探してしまえば、新しくループをしなくてもすむでしょう。

(例えば下の一行を追加)

Ary(1, Num) = Selection.ShapeRange.ZOrderPosition
If Ary(1, Num) > Mxm Then Mxm = Ary(1, Num) '←この行を挿入
Num = Num + 1

目的が最前面の図形以外を消去するだけならば、↑で同時に最大値の時の番号(Num)も記憶しておいて、消去するループではその番号以外を消去してあげればよろしいかと…


Shape(i)はZorder順に並んでいるみたいなので(For Eachでも同じ順みたい)、図形の消去だけが目的なら、別の考え方ですが、以下のように一回のループで配列を利用しなくても可能かと思います。(未検証)
flag = False '←最前面Shapeの検索フラグ
For i = ActiveSheet.Shapes.Count To 1 Step -1
If (Shpeの検索条件に合致するか) Then
  If flag Then Shapes(i).Delete Else flag = True
End If
Next i

この回答への補足

(お礼の後の補足です)
Sub testTurn()
Dim Shp As Shape
For Each Shp In ActiveSheet.Shapes
Shp.Select
Application.Wait [NOW()+"0:00:01"]
Next Shp
End Sub

fujillinさんの御指摘があったので、検証してみたら、For Each 構文や Do Loop 構文もZorder順で選択しているみたいです。(Excel 2007)
fujillinさん、マクロが単純化できそうです!どうもありがとうございます!!

あとすいません。勘違いしてました。多次元の配列の最大値を求める場合もApplication.WorksheetFunction.Max(Ary)で出来ました。
今回の場合は図形が配列にSetされていたからダメだとわかりました。訂正します。。。

補足日時:2009/05/13 22:51
    • good
    • 0
この回答へのお礼

御回答ありがとうございます!!
やはり、多次元の配列の最大値を求める場合は総当たりしかないという事ですね!わかりました!!
やたら繰り返し構文が多いコードでしたので、fujillinさんの御指導で、マクロ高速化になりそうです!!

For Each 構文や Do Loop 構文が、Shape(i)がZorder順なのかどうかですが、codename順(sheets()のようにcodenameが取得できませんが、いわゆる新しい図形順)なのか、Zorder順なのかで未検証のままでした。他の要素も絡んでくると大変なので、手を付けてませんでした。確かにこれが明確ならば、かなりコードも単純化しそうですね!!

お礼日時:2009/05/13 20:49

こんばんは。



VBAの教科書では、オブジェクトを確保するのは、配列にするよりも、コレクション・オブジェクトにするというように書いてあるかとは思います。

  Dim colShp As New Collection
    For Each shp In ActiveSheet.Shapes
    colShp.Add shp
  Next

このように確保します。
しかし、もともと、Shapes は、コレクションですから、Index を取っていけば、それで、ZOrderPosistion と一致しているはずですから、以下のようにすればよいと思います。オブジェクトですから、ひとつずつ削除するのではなく、一括して削除します。

Sub TestSample()
  Dim i As Long
  Dim mx As Long
  With ActiveSheet
    mx = .Shapes.Count
    If mx = 1 Then Exit Sub '既に処理した場合は解除
    .Shapes(1).Select '誤動作を避けるため
    For i = 1 To mx - 1
      .Shapes(i).Select False
    Next i
  End With
  Selection.Delete
End Sub

なお、配列の最大値を取る方法には、裏技があって、ふつうは、1次元配列で、ワークシートのMax を取ります。検討してみてください。
    • good
    • 0
この回答へのお礼

御回答ありがとうございます!
なるほど、ZOrderPosition と Index がいっしょなのですね!!
New Collection というのがあるのですか。。。
やっと少しVBAをさわるのに慣れてきましたが、
まだまだ教科書的な基本事を知らないままですね。
Wendy02さんの描いて頂いたコードがスッキリまとめてくれていて、わかり安くて良いですね!!
どうもありがとうございます!!

お礼日時:2009/05/13 23:12

回答2です。


戯けた回答をしてました。
objectが入ってますね。

で、素直に比較していったらどうでしょうか。
-------------------------------------
 Dim myMax, i
 
 myMax = ary(1, 0)
 
 For i = 1 To sum
   If ary(1, i) > myMax Then myMax = ary(1, i)
 Next i

 MsgBox myMax
-----------------------------------------

 
 
    • good
    • 1
この回答へのお礼

出来ました!!
配列をさらに変数に代入させるという事が、考えつきませんでした。
myRangeさんの御指摘の比較の総当たり方法で成功しました!!!
コードも描いて頂きありがとうございます!!

配列をさらに変数に代入させるというアドバイスも頂いたので、
ある意味、配列をわざわざ二次元にしなくとも二つの配列に増やしてもいいのではと思い、
配列を Ary1(0, Num) ←Shape を 格納 と Ary2(0, Num) ← ZOrderPosition を格納で
Mxm = Application.WorksheetFunction.Max(Ary2)
でもコードが動きました!!

出来て嬉しいです!ありがとうございます!!!

お礼日時:2009/05/13 20:29

 


これではどうでしょう

Mxm = WorksheetFunction.Max(Ary, 1)
 
外しましたらご容赦!
 

 
    • good
    • 0
この回答へのお礼

御回答ありがとうございます!
Mxm = WorksheetFunction.Max(Ary, 1)
の 『, 1』は何でしょうか??
myRangeさんの御指摘で、
配列に図形が入っているとできないとう事がわかりました!
ありがとうございます!!

お礼日時:2009/05/13 20:11

ActiveSheet.Shapes.Count


でどうでしょう?

この回答への補足

早速の御回答ありがとうございます!
すいません、ActiveSheet.Shapes.Count は突っ込まれるかと思いました。説明も不足してました。
あと、Erase Shp は Erase Ary です。すいません。。。
ActiveSheet.Shapes.Count を使わないのは、Shape 自体にいくつかの分類を作り名前を与えています。
(For each next の構文内に If Shp.name Like "~~" で指定)
複数の特定の同名を付けられた図形の中で、というのと、別のマクロで ZOrderPosition を逐一変えてしまっている、という点があり、話を複雑にしてしまっています。
今のところ配列内の最大値をマクロで求めたいと思っています。

補足日時:2009/05/13 17:21
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q配列の中から最大値だけ取り出す方法

VB 2005,Framework2.0を使用しています。

複数のある配列の中から最大値の値だけを抽出するプログラムを作ろうと思っています。
For等のループを使うのは分かりますが、そこからどの様にコードを書けばいいのか分からなく困っています。


例えば配列にランダムに数値が入っていたとします。

Dim Hako(5) As Integer

Hako(0) = 10
Hako(1) = 16
Hako(2) = 31
Hako(3) = 12
Hako(4) = 42
Hako(5) = 5

とあったらこの配列の中の最大値(42)のみを抽出したいです。
宜しくお願いします。

Aベストアンサー

こんにちは
 戦略としてソートプロシージャがライブラリとして既にあるならソートして結果を得ればOkです。
 全要素数が判っていて一つ一つ比較して調べるなら下記を参考にして下さい。

CONST LastItem = 6'調べる配列データの最大要素数
DIM I AS INTEGR'LOOP変数
DIM MaxItem AS INTEGER'最大値を格納

 LET MaxItem=0'結果を入れる変数は、初期化しておく

 FOR I=0 TO LastItem-1 STEP 1
  '調べた最大値とデータを比較し最大値だったら入替える
  IF Hako(I)>MaxItem THEN LET MaxItem=Hako(I)
 NEXT I
 PRINT MaxItem
END

QEXCEL VBAで計算値を四捨五入、切り上げ、切捨てする方法

ネットで探してみたのですが、計算結果を四捨五入して特定のセルを
返すにはどうしたらいいのでしょうか?

Sub hokangosa()

Dim ZPS As Double
Dim ZPOS As Double
Dim DMN As Double
MsgBox (" >>> 補間誤差自動計算 <<< ")
MsgBox (" >>> 初期値入力します <<< ")
ZPS = InputBox(">>> ステップを入力してください<<<")
ZPOS = Sheet1.Cells(22, 4).Value
DMN = ZPOS / ZPS
Sheet1.Cells(23, 6).Value = DMN
End Sub

ここでDMNの値を四捨五入したいです。

またこれとは別に切上げ、切捨ても教えていただけるとありがたいです。

Aベストアンサー

DMN = Application.WorksheetFunction.Round(ZPOS / ZPS, 0)
で、四捨五入
DMN = Application.RoundDown(ZPOS / ZPS, 0)
で切り捨て
DMN = Application.RoundUp(ZPOS / ZPS, 0)
で切り上げです。

引数で、対象桁を変更できます。

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。

Q別のシートから値を取得するとき

Worksheets("シート名").Activate
上記のを行ってから別シートの値を取得するのですが、
この処理を行うと指定したシートへ強制的にとんでしまいます。。。

※イメージ
For ~ To ~
  Worksheets("シートA").Activate
  シートAの値取得
       :
  Worksheets("シートB").Activate
  シートBの値取得
Next

このイメージ処理を行うとものすごい勢いで画面がチカチカします。。。
シートを変えずに他のシートから値を取得する方法はないのでしょうか。
教えてください!

Aベストアンサー

Worksheets("シートA").Range("A1")

みたいな感じでできませんか?

QEXCELファイルのカレントフォルダを取得するには?

EXCELファイルのカレントフォルダを取得するには?

C:\経理\予算.xls

D:\2005年度\予算.xls

EXCEL97ファイルがあります。

VBAで
  カレントフォルダ名
(C:\経理\,D:\2005年度\)
を取得する事は可能でしょうか?

CURDIRでは上手い方法が見つかりませんでした。

Aベストアンサー

こんばんは。
Excel97 でも、同じですね。以下で試してみてください。

Sub test()
'このブックのパス
a = ThisWorkbook.Path
'アクティブブックのパス
b = ActiveWorkbook.Path
'Excelで設定されたデフォルトパス
c = Application.DefaultFilePath
'カレントディレクトリ
d = CurDir
MsgBox "このブックのパス   : " & a & Chr(13) & _
   "アクティブブックのパス: " & b & Chr(13) & _
   "デフォルトパス    : " & c & Chr(13) & _
   "カレントディレクトリ : " & d & Chr(13)
End Sub

Q配列に中で一番小さい値を教えてくれる関数ありませんか/アクセス、VBA

Dim Arry(10) As integer

この配列 Arry(1,2,3,4...)
の中で一番小さい値は何番目の値は何か
知る関数なんか、ありませんか

Aベストアンサー

Excelのワークシート関数を使う超手抜き関数です。 (^_^;)

Function K() As Integer
Dim ObjXL As Object
Dim arrayVal(2) As Integer
arrayVal(0) = 10
arrayVal(1) = 5
arrayVal(2) = 8

Set ObjXL = CreateObject("Excel.Application")
K = ObjXL.Application.WorksheetFunction.Min(arrayVal())
Set ObjXL = Nothing

'Debug.Print Excel.Application.WorksheetFunction.Min(arrayVal())
'Microsoft Excel ○○ Object Library に参照設定がしてあれば↑だけでも
End Function

まじめに考えたいときは
[VB] ソートのアルゴリズム
http://support.microsoft.com/default.aspx?scid=kb;ja;169617

Excelのワークシート関数を使う超手抜き関数です。 (^_^;)

Function K() As Integer
Dim ObjXL As Object
Dim arrayVal(2) As Integer
arrayVal(0) = 10
arrayVal(1) = 5
arrayVal(2) = 8

Set ObjXL = CreateObject("Excel.Application")
K = ObjXL.Application.WorksheetFunction.Min(arrayVal())
Set ObjXL = Nothing

'Debug.Print Excel.Application.WorksheetFunction.Min(arrayVal())
'Microsoft Excel ○○ Object Library に参照設定がしてあれば↑だけでも
End Function

まじめに考...続きを読む

Q【Excel VBA】指定した行の最大値を持つセル番地を取得したい

指定した範囲内で最大値及び最小値のセル番地を取得するには、
どうコーディングしたらよろしいでしょうか?

対象範囲 A1:Z2000の各行(行番は変数で処理)
例えば、
----------------------------------------------------
For x = 1 To 2000
Range(A列のx行目:A列のx行目)の最大値 → B列
               最小値 → Y列
Next x
----------------------------------------------------
このように、2000行分同じことを繰り返し、それぞれの行内での
最大値及び最小値を含むセルの列名を取得し、
B列のx行目を赤(最大値)
Y列のx行目を青(最小値)
に着色したいのです。

よろしくお願いします。

Aベストアンサー

#1です。

高速化してみました。
配列は使ってません。

Sub test2()
  Dim x As Long, y As Long, ct As Long
  Dim myLastRow As Long, myLastCol As Long
  Dim myMatchMaxCol As Long, myMatchMinCol As Long
  Dim myMax As Double, myMIn As Double
  Dim myRng As Range

  myLastRow = Cells(Rows.Count, 1).End(xlUp).Row
  myLastCol = Cells(1, Columns.Count).End(xlToLeft).Column
  
  Application.ScreenUpdating = False
  Range("A1").CurrentRegion.Interior.ColorIndex = xlNone
  For x = 1 To myLastRow
    Set myRng = Range(Cells(x, 1), Cells(x, myLastCol))
    myMax = Application.WorksheetFunction.Max(myRng)
    myMIn = Application.WorksheetFunction.Min(myRng)
    myMatchMaxCol = Application.Match(myMax, myRng, 0)
    myMatchMinCol = Application.Match(myMIn, myRng, 0)
    Cells(x, myMatchMaxCol).Interior.ColorIndex = 3
    Cells(x, myMatchMinCol).Interior.ColorIndex = 5
  Next x
  Application.ScreenUpdating = True
  
  Set myRng = Nothing
End Sub

#1です。

高速化してみました。
配列は使ってません。

Sub test2()
  Dim x As Long, y As Long, ct As Long
  Dim myLastRow As Long, myLastCol As Long
  Dim myMatchMaxCol As Long, myMatchMinCol As Long
  Dim myMax As Double, myMIn As Double
  Dim myRng As Range

  myLastRow = Cells(Rows.Count, 1).End(xlUp).Row
  myLastCol = Cells(1, Columns.Count).End(xlToLeft).Column
  
  Application.ScreenUpdating = False
  Range("A1").CurrentRegion.Inte...続きを読む

QExel VBA 別ブックから該当データを検索し、必要なデータを取得する方法について

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数ではなく、マクロで処理を希望します。

自分では、部品表の商品番号をコピーして、コード一覧表で検索し、検索結果の右隣のセル(B列のコード)の値を部品表のC列に貼り付ければよいかと思い、書いてみたんですが…

Sub 別ブックから貼り付ける()
  Dim 検索する As Long
Windows("部品表.xls").Activate
検索する = cells(i,2).Value
Windows("コード一覧表.xls").Activate
ActiveWindow.SmallScroll Down:=-3
Selection.AutoFilter Field:=3, Criteria1:="=検索する", Operator:= xlAnd

と、してみたものの、検索しても、その検索結果の隣のセルのコードをどうやって取得すればいいのかが、わかりませんでした。

基本事項は本で学びましたが、呪文のようなコードはよく理解できません。懸命にネットで検索して、訳して理解する努力をしてはいますが。

どうぞよろしくお願いします。

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数...続きを読む

Aベストアンサー

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks.Open("C:\★★\コード一覧表.xls") '★要変更★
 I = 2
 Do While Range("A" & I).Value <> ""
  ThisWorkbook.Worksheets("Sheet1").Range("C" & I).Value = Application.VLookup(ThisWorkbook.Worksheets("Sheet1").Range("B" & I).Value, xlBook.Worksheets("Sheet1").Range("A2:B65535"), 2, 0)
  I = I + 1
 Loop
 xlBook.Close
 Application.ScreenUpdating = True
 MsgBox ("完了")
End Sub

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks....続きを読む

QEXCEL VBAマクロ作成で、他のEXCELからデータを取り込みたい

メインプログラム(EXCEL VBA)より、
他のフォルダーにあるEXCELの項目の内容を取り込みたいです。
たとえば他のフォルダーのEXCELのRange("A2:A3").ValueをメインプログラムのRange("C2:C3").Valueにセットしたい時です。

・コマンドボタン押したら、どこのEXCELから取り込むかのポップアップ(?)は、表示はできてます。
・作業者が選んだパスとブックもMsgBoxで表示できてるので、もらう相手の場所も取得できてます。

・となると次はOPEN,INPUTですか?
テキストデータの取り込みですと、Inputでそのバッファを定義してるのですが、なんか違うような。。。

よろしくお願いします!

Aベストアンサー

私がやる方法です。

Dim writeSheet As Worksheet ' 自分自身の書き出し先シート
Set writeSheet = ThisWorkbook.Worksheets(1) ' Sheet1 を参照

Dim readBook As Workbook ' 相手ブック
Set readBook = Workbooks.Open(filename) ' 相手ブックを開いて参照
Dim readSheet As WorkSheet ' 相手シート
Set readSheet = readBook.Worksheets("sheetName") ' 相手シートを参照
' または Set readSheet = readBook.Worksheets(sheetIndex)

' 例えば
writeSheet.Cells(1, 1).Value = readSheet.Cells(2, 2).Value ' 相手シートの B2 の値を自分自身の A1 に書き込む

readBook.Close False ' 相手ブックを閉じる
Set readSheet = Nothing
Set readBook = Nothing

私がやる方法です。

Dim writeSheet As Worksheet ' 自分自身の書き出し先シート
Set writeSheet = ThisWorkbook.Worksheets(1) ' Sheet1 を参照

Dim readBook As Workbook ' 相手ブック
Set readBook = Workbooks.Open(filename) ' 相手ブックを開いて参照
Dim readSheet As WorkSheet ' 相手シート
Set readSheet = readBook.Worksheets("sheetName") ' 相手シートを参照
' または Set readSheet = readBook.Worksheets(sheetIndex)

' 例えば
writeSheet.Cells(1, 1).Value = readSheet.Ce...続きを読む

QVBA 実行時エラー1004 rangeメソッドは失敗しました。globalオブジェクトのエラー

始めまして、VBA初心者のものです。
ただいまエクセルでグラフを作成しています。作業自体は単純作業の繰り返しなのでVBAを用いてやりたいのですが、マクロを実行したときに実行時エラー’1004’rangeメソッドは失敗しました。’_global’オブジェクトとメッセージが出て、実行できません。 デバックをすると以下の5行目で黄色のバーが出ていました。自分なりに原因を考えたのですがrangeの関係するところに、Range("A8:A1587,e8:e1587")というような変数を用いないやり方でやると上手くいくので、変数に関する定義がまずいと思うのですが、それ以上の事は分かりません。どなたか、分かる方がおりましたら、よろしくお願いします。また、プログラムは以下のようになります。

Sub 繰り返し()
'繰り返し
Dim s As Integer
For s = 0 To 17
Range("cells(8,1):cells(1580,1),cells(8,s+2):cells(1580,s+2)").Select
Range("cells(8,s+2)").Activate
Charts.Add
ActiveChart.ChartType = xlXYScatter
ActiveChart.SetSourceData Source:=Sheets("20081216_210647").Range( _
"cells(8,1):cells(1580,1),cells(8,s+2):cells(1580,s+2)"), PlotBy:=xlColumns
ActiveChart.SeriesCollection(1).Name = "=""0810p2x"""
ActiveChart.Location Where:=xlLocationAsNewSheet, Name:="0810p2x"
With ActiveChart
.HasTitle = True
.ChartTitle.Characters.Text = "0810p2x"
.Axes(xlCategory, xlPrimary).HasTitle = True
.Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "t"
.Axes(xlValue, xlPrimary).HasTitle = False
End With
Next
End Sub

始めまして、VBA初心者のものです。
ただいまエクセルでグラフを作成しています。作業自体は単純作業の繰り返しなのでVBAを用いてやりたいのですが、マクロを実行したときに実行時エラー’1004’rangeメソッドは失敗しました。’_global’オブジェクトとメッセージが出て、実行できません。 デバックをすると以下の5行目で黄色のバーが出ていました。自分なりに原因を考えたのですがrangeの関係するところに、Range("A8:A1587,e8:e1587")というような変数を用いないやり方でやると上手くいくので、変数に関する定義...続きを読む

Aベストアンサー

>ご指摘を受けたところを書き換えて回してみた結果、書き換えた箇所
>でエラーがでます。(実行時エラー’1004’’cells’メソッドは失敗
>しました。’global’オブジェクト)
>しかし、何が原因でエラーになるか自分では分かりません。

≪例1≫
Range(Cells(8, 1), Cells(1587, 2)).Select
上記の例では、RangeとかCellsの上位オブジェクトであるシート名が省略されています。
ActiveSheet.Range(ActiveSheet.Cells(8, 1), ActiveSheet.Cells(1587, 2)).Select
というわけです。
マクロ実行時に、Activeな(Excelで表示されている)シートが上位オブジェクトとして、自動的に認識されます。

≪例2≫
Sheets("Sheet2").Range(Cells(8, 1), Cells(1587, 2)).Select
上記の例では、Rangeのみシート名が記述されています。
Sheets("Sheet2").Range(ActiveSheet.Cells(8, 1), ActiveSheet.Cells(1587, 2)).Select
というわけです。
Activeなシートが、Sheet2の場合はエラーになりません。
しかし、ActiveなシートがSheet2以外の場合、エラーが発生します。
直前に、
Sheets("Sheet1").Select
などとしていれば、ActiveシートがSheet1になっていますから、エラーになります。

Sheets("Sheet2").Range(Sheets("Sheet2").Cells(8, 1), Sheets("Sheet2").Cells(1587, 2)).Select
と書いておけば安心です。
Withステートメントを使えばスッキリ纏めることができます。
With Sheets("Sheet2")
  .Range(.Cells(8, 1), .Cells(1587, 2)).Select
End With

# Sheets("Sheet2")の上位オブジェクトが省略されていることにも気がついてください。

>そこで自分で基礎を勉強したいのですが推薦できる参考書などがござ
>いましたら、教えていただけませんか?
私自身は、入門書程度の雑誌を1冊買っただけです。どれが良いとかはよく分かりません。
「マクロの記録」を活用して、参考コードを取得し、汎用性のあるコードに編集しています。
新しい単語があれば、文字カーソルを単語の上に置き、F1キーを押してVBAのヘルプを必ず見るようにしています。
躓いた時は、Web検索して欲しい情報を得たり、あるいは、こうした掲示板で先輩方のお力をお借りしています。

Excel(エクセル)VBA入門:目次
http://oshiete1.goo.ne.jp/kotaeru_reply.php3?q=4651404
エクセル入門・初級編
http://www.kenzo30.com/excel_kiso.htm

>ご指摘を受けたところを書き換えて回してみた結果、書き換えた箇所
>でエラーがでます。(実行時エラー’1004’’cells’メソッドは失敗
>しました。’global’オブジェクト)
>しかし、何が原因でエラーになるか自分では分かりません。

≪例1≫
Range(Cells(8, 1), Cells(1587, 2)).Select
上記の例では、RangeとかCellsの上位オブジェクトであるシート名が省略されています。
ActiveSheet.Range(ActiveSheet.Cells(8, 1), ActiveSheet.Cells(1587, 2)).Select
というわけです。
マクロ実行時に、Activeな...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報