ExcelVBA Deleteの引数省略について

このQ&Aのポイント
  • ExcelVBAにおけるDeleteメソッドの引数を省略した場合のシフト方向について、説明が矛盾しているため、正しい挙動を知りたい。
  • 一部のサイトでは、【行数 = 列数】の場合は上方向にシフトし、【行数 < 列数】の場合は左方向にシフトすると説明しているが、別のサイトでは【行数 = 列数】の場合は左方向にシフトし、【行数 < 列数】の場合は上方向にシフトすると説明している。
  • 正確な挙動を知りたいが、引数を省略しないようにすることを推奨されるため、ハッキリとした回答が欲しい。
回答を見る
  • ベストアンサー

ExcelVBA Deleteの引数省略について

アクセスありがとうございます。 ExcelVBAはちょこちょこ簡単なものを使っているのですが、 基本からみっちり勉強した事がないので、今、一から勉強しなおしています。 その中で、Deleteメソッドの引数を省略した場合のシフト方向について、 分からない所があり、質問させていただきました。 あるサイトで、セルの削除にはDeleteメソッドを使う、とあり、 引数を指定しない場合、セルの削除後、どの方向にシフトするか説明がありました。 以下、引用します。 >引数を指定しない場合、【行数 = 列数】の場合は削除後、上方向にシフトします。 >【行数 < 列数】の場合は左方向にシフトし、【行数 > 列数】の場合は >削除後、上方向にシフトします。 また、例として、下記のようにありました。 >'アクティブなシートのセルB1~D3の範囲の削除(行数>列数なので左方向にシフト) >Sub DeleteCell() > Range("B1:D4").Delete >End Sub 説明の中にある、範囲が間違っていますよね。 そして、説明では、「【行数 > 列数】の場合は、削除後、上方向にシフト」とあります。 ところが、例の中では、左と書かれている…。 仕方ないので、Excelに、上の例文を貼り付けて、実行してみました。 すると、左にシフトするのです。 あれ、じゃあ、説明文が間違っている??? 別のサイトを検索してみたら、 >省略した場合、セル範囲が縦長の場合には左方向に、 >横長か正方形の場合には上方向に移動します。 とあり、B1:D4は、横長なので、上方向になるはず…。 もう、訳がわかりません^^; 引数を省略しない方がいい事は分かっているんで、するつもりはないんですが、 このモヤモヤを解決したく、どこが間違っているのか ハッキリして欲しいと思うのです…。 拘るほどの事ではないのかもしれませんが、お分かりの方いらしたら、ご教授下さい。 よろしくお願いいたします。

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

  • ベストアンサー
  • DreamyCat
  • ベストアンサー率56% (295/524)
回答No.2

>>B1:D4は、横長なので、上方向になるはず…。<< エクセルでデータを扱うときの範囲はセル範囲で考えてください。縦長です。 横はB,C,Dの3つ 縦は1,2,3,4の4つ ですから左シフトします。 お書きになっている通りですが、他のデータの位置を考えると引数を省略しないのが確実です。 Range("b5:f8").Delete 'Shift:=xlShiftUp 'xlShiftToLeft

cat-cat14
質問者

お礼

回答ありがとうございます! ほんとですね!!縦長でした!!! 納得です。 省略はしないよう心がけます、ありがとうございました!!

その他の回答 (1)

  • mu2011
  • ベストアンサー率38% (1910/4994)
回答No.1

エクセル2007でしたが、以下の通りの振る舞いでした。 行≦列ならば上方向(横長) 行>列ならば左方向(縦長)

cat-cat14
質問者

お礼

回答ありがとうございました! ExcelのVerも書かずにすみませんでした^^; 無事解決しました。ありがとうございます。

関連するQ&A

  • 自作したメソッド・・・引数はなるべく省略すべき?(VB2005)

    自作したメソッドに関して、引数はなるべく設定するべきでしょうか?それとも、引数は省略できるなら省略したほうがよいでしょうか? 下記(a)、(b)は例です。 a)引数はなるべく省略   ---------------------------------   Private Sub hoge()     Call foo()   End Sub   Private Sub foo()     Dim hoga As integer = Pbar    'プロパティ「Pbar」の値を設定     '処理   End Sub   --------------------------------- b)あえて引数を設定   ---------------------------------   Private Sub hoge()     Dim hoga As integer = Pbar    'プロパティ「Pbar」の値を設定     Call foo(hoga)   End Sub   Private Sub foo(ByVal hoga As integer)     '処理   End Sub   --------------------------------- 現在、(b)のようにあえて引数を設定したほうが、呼び出し先のメソッドがどういう処理を行っているかを掴めていいかな?と考え始めています。 ご助言よろしくお願い致します。

  • 挿入、削除に影響されない引数にする方法

    XP,Excel。例えばA1セルにデータを入れ、B1セルで「=A1」とか関数の引数等として引用しているとします。ここで、A1セルに例えば2行分のセルを「下方向にシフトする」で"挿入"すると、B1セルの式は「=A3」に変わります。関数の引数でも同様です。これを、A列で挿入しようが削除しようが他の列では「=A1」をそのままにしておく方法はないでしょうか?教えてください。

  • VBScriptで引数を省略したい場合

    VBScript の Function、Sub プロシージャで引数を省略したい場合、Optional キーワードが使えないので、空文字を渡すようにしていますが、これは言語仕様的に正しいやり方でしょうか? Sub MyProc(ByVal a, ByVal b) . . . End Sub Call MyProc(a, "")   '← 引数 b は状況に応じて省略したい。 よろしくお願いします。

  • 【ExcelVBA】 セルの削除(上方向にシフト)を超高速にする方法

    Range("A1:A100").Delete Shift:=xlUp で セルの削除で上方向にシフトになりますが、 この作動が0.17秒くらいかかります。 これを0.10秒未満に。 できれば0.02秒くらいにしたいのですが、 何か別の方法ありませんでしょうか。 また、コードの工夫以外にも、 Officeの設定で早くなったりするのでしょうか? セルが削除されなくても、下のセルが上へ移動でも構いません。 たとえば、Rnage("A1”)=Range("B1")に変数を使って、 ループで100セル繰り返せば、実質同じ作動になりますが、Deleteより当然遅いです。 さらに、Rnage(”B1")より下のセルが、全て上方向に 移動しないと困るので確実に使えません。 環境 WinXP、Win7 Office2003 ハードについてのアドバイスは一切不要です。 高速な作動が必要な理由についての返答は一切不要です。

  • excelvbaでセルの範囲について

    Sub Macro2() Sheets("売上まとめ").Select '選べる範囲を指定  Set myRng9 = Range("B2:B15") '選択した範囲を myRng1に割り当てる Set myRng1 = Application.InputBox("全部は選択しないで下さい", "必要売上を「B2:B15」から選択", Selection.Address, Type:=8) myRng1.Resize(1, 2).Offset(0, -1).Select  皆様どうかよろしくお願いいたします。 まずB2セルからB15セルの間に数字が入力されています。 上から下に向けて続けて数字が入力されていますが 下の方は空白の場合があります。 (例 B2からB10は入力あり。B11からB15は空白) まず、インプットボックスで数字が入力されている範囲を B2セルから下方向に操作者に選択させます。 (例えばB2からB7まで。) この範囲をmyRng1としています。 目標として選んだ範囲を1列左に拡張させて 選択させたいのですが、 (例 B2だけ    を選択していたらA2からB2まで    B2からB8まで を選択していたらA2からB8まで) その部分を現在 こう記述しております。 myRng1.Resize(1, 2).Offset(0, -1).Select  単一セルだけを選択している場合は キチンと左方向に拡張させて選択できるのですが (例 B2だけ    を選択していたらA2からB2まで) 複数範囲を選択している場合でも同じ結果になってしまいます。 例 B2からB8まで を選択していてもA2からB2まで) どうかよろしくご指導お願いいたします。

  • .NET - 配列変数を省略可能の引数にする方法

    お世話になっています。 .NETでのコーディングを行っています。 標記の件ですが、初めてなので .NETからなのか、もともとそうなのかは不明なのですが、 プロシージャの引数をOptionalで宣言すると、 省略された時の値を設定する必要がありますよね。 省略可能の引数を配列変数にしたい場合、どのように宣言したら良いのでしょうか? 初期値って言っても、今回省略可能にしたい変数は、 検索結果を格納するための変数ですので、 省略されたときには何の値も入っていなくて良いんです。 宣言部分は以下のとおりです。 Public Function CM_fun_b_Get_WeekdayNm(ByRef Wstr_WeekKb() As String, _ ByRef Wstr_WeekNm() As String, _ ByRef Wstr_WeekNmR() As String) As Boolean この、Wstr_WeekNmR()を省略可能にしたいのです。 このような場合、どうやって宣言するべきなのでしょうか? ヘルプを見たのですが、よくわからなくて・・・(;_;) 念のため、省略された時に、何らかの値を設定する方法も知りたいです。 よろしくお願いいたします。

  • EXCELのマクロで条件に一致したセル範囲を削除する方法

    済みません、どなたか教えて下さい。 001 100 200 300 400 001 111 222 100 201 301 444 001 111 222 100 202 300 400 001 111 222 100 203 301 400 001 111 222 100 204 300 440 002 100 200 300 400 002 111 222 100 201 301 400 002 111 222 100 202 300 404 002 111 222 100 203 300 400 002 111 222 100 204 301 444 Excelで上記のような表があるとします(行列番号は省略しています)。 2列目に注目していただきたいのですが、データが111の場合のみ、右隣のセルに222という値があります。 この111と222の入ったセルのみを削除(左方向にシフト)したいのですが(この場合B2:C5とB7:C10)、 データが多い為手動では非常に時間がかかります。 そこでこれをマクロ化したいと考えているのですが、どのようにすればよいのか方法(考え方)がわかりません。 VBAは初心者ですが、かなり難しいでしょうか。 ちなみに、データのレコード数は決まっておりません。 上記の例で言う111、222の入る列番号は決まっております。 よろしければどなたかご指導下さい。宜しくお願いいたします。

  • ExcelVBAで、マージのコレクションの取得

    ExcelVBAで、任意のセル範囲内に含まれる(完全に含まれる、一部が含まれるは問題視していません)結合セルのコレクションの取得って出来るのでしょうか?やっぱり、RangeのEachループで、MergeAreaの戻り値を検証するしかないのでしょうか?SpecialCellsメソッドみたいなので無いのでしょうか?宜しくお願いします。 例:Range("A1:"K30")のセル範囲を選択している状態で、その範囲内にRange("B2:C4")、Range("E9:F12)、Range("H16:H20")のセル範囲が結合状態にある場合にその結合されているセル範囲を取得したいのですが!!

  • デフォルト引数の意味が解りません

    //正しい void func1(int a, int b, int c, int d=2, int e=10) 右から順にデフォルト引数を設定することができます。 //誤り void func2(int a, int b =2, int c, int d, int e=10) このようなデフォルト引数の指定はできません。 このfunc1()関数は次のように呼び出すことができます。 (1)func1(10, 5, 20); (2)func1(10, 5, 20, 30); (3)func1(10, 5, 20, 30, 50); (1)は、デフォルト引数を指定した二つの引数を省略して呼び出しています。つまり引数dは2、 eは、10で初期化されます。 (2)には、最後の引数を省略して呼び出しています。つまり、最後の引数eが10で初期化されます (3)は、すべての引数を指定して呼び出しています。 とあるのですが、まったく意味が解りません。 どうかこの問題を解る方解りやすく説明お願いします。  

  • エクセルの文字の消し方

    エクセルの文字の消し方について質問です。 A列、B列のセルに沢山文字を打ち込んであります。 それをセルの幅、高さを変えないで打ち込んだ文字だけ消す方法はありますか? A列(110ピクセル)、B列(50ピクセル)と幅を設定しています。 A列、B列を右クリックして削除すると指定した幅のセルが消えてしまいます。 消したいセルをドラッグして右クリックして削除にすると左方向にシフト 右方向にシフトで消えてしまいます。 セルの幅、高さは残したまま文字だけ消す方法を教えてください。 お願いします。

専門家に質問してみよう