• ベストアンサー

Offsetの関数に関して(VBA)

Offsetの使い方を教えて下さい。 どういう時に使うものなのでしょうか? 例えば以下のoffsetの分はどういう意味なのでしょうか? A = ActiveCell.Offset(0, 0).Value ご教示頂ければ幸いです。

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

  • ベストアンサー
  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.6

ActiveCell が基準位置(原点) Offset(x, y) が移動量になります。 x に正の値を入れると下の行のセルを参照し、負の値を入れると上の行のセルを参照します。 y に正の値を入れると右方向のセルを参照し、負の値を入れると左方向のセルを参照します。 (0,0) のセルを基準にすると、下記のように鳴ります。 [-1,-1][-1, 0][-1, 1] [ 0,-1][ 0, 0][ 0, 1] [ 1,-1][ 1, 0][ 1, 1] なので、 For i=1 to 9 For j=1 to 9 Range("A1").Offset(i-1,j-1) = i * j '下記も同じ事が出来ます。 'Cells(i,j) = i * j Next Next Offset を使うと、あるセルを基準にして、セルを相対指定する事が可能になります。 上記の例だと、"A1" を "C5" などと書き換えるだけで別の位置に表を書けます。 Cells() の場合、別の位置に表を書こうとすると、オフセット分を任意に書き加えないといけませんよね。

その他の回答 (5)

回答No.5

オフセットとは、「下駄を履かせる」のゲタに相当します。ゲタを履かせることで、xy座標上の点の平行移動なんか、簡単に実現しますね。例えば「xのオフセットは3だよ~」とやるだけでいいんですからラクチンです。

  • marbin
  • ベストアンサー率27% (636/2290)
回答No.4

#3に間違いがありました。 × 1行右に、でしたら、 ○ 1列右に、でしたら、 でした。失礼しました。

  • marbin
  • ベストアンサー率27% (636/2290)
回答No.3

書き忘れましたが、移動行、列数が"0"の場合は、 省略できます。 1行下に、でしたら、 offset(1) 1行右に、でしたら、 offset(,1) でOKです。

  • marbin
  • ベストアンサー率27% (636/2290)
回答No.2

こちら↓も参考になると思います。 http://www.sanynet.ne.jp/~awa/excelvba/kouza/chapt_02/007.html

参考URL:
http://www.sanynet.ne.jp/~awa/excelvba/kouza/chapt_02/007.html
  • marbin
  • ベストアンサー率27% (636/2290)
回答No.1

ご提示の記述は 変数Aを アクティブセルから0行0列移動したセルの値とする という意味になります。 カッコ中は、 (行数、列数) を意味し、 (1,1) ですと、1行下、1列右 という意味になります。 (-1、-1) は、1行上、1列左、になります。

関連するQ&A

  • エクセルVBAでの関数

    下記、コードでセルに関数を入れるようにしてるのですが 関数で得られた値をセルに反映されるようにしたいのですが Dimを使用してもどう指定してよいのかわからず苦戦しております。 宜しくお願い致します。 Range("F1").Select Do Until ActiveCell.Offset(0, -1).Value = ""       With ActiveCell .FormulaR1C1 = "=MID(RC[-1],2,3)" .Offset(1, 0).Select End With Loop Range("A1").Select Do Until ActiveCell.Offset(0, 2).Value = "" With ActiveCell .FormulaR1C1 = "=RC[11]&RC[5]&Rc[8]&rc[9]&rc[3]" .Offset(1, 0).Select End With Loop

  • offset関数について

        OFFSET関数で、行を自動計算で算出する方法をご教示下さい。 例) =OFFSET(A1,1,1)を =OFFSET(A1,#+1,1)     といったように計算式で入力したいと考えています。          現状ですと、横にドラッグして自動計算を試みると計算できません。     宜しくお願いします。

  • エクセルVBAで無限ループ

    教えてください。 以下の2つのエクセルマクロはまったく同じことをさせようとしているのですが、test02の方は.Offset(1).Activateが働かないのか、無限ループに陥ってしまいます。 単にActiveCell.という記述をWith~End Withでまとめただけなのになぜこうなるのでしょうか? Sub test01() ActiveSheet.Cells(1, 1).Activate Do While ActiveCell.Value <> "" If Not IsNumeric(ActiveCell.Value) Then ActiveCell.Offset(0, 1).Value = "文字" ElseIf ActiveCell.Value > 0 Then ActiveCell.Offset(0, 1).Value = "正数" ElseIf ActiveCell.Value < 0 Then ActiveCell.Offset(0, 1).Value = "負数" Else ActiveCell.Offset(0, 1).Value = "その他" End If ActiveCell.Offset(1).Activate i = i + 1 Application.StatusBar = i Loop End Sub Sub test02() ActiveSheet.Cells(1, 1).Activate With ActiveCell Do While .Value <> "" If Not IsNumeric(.Value) Then .Offset(0, 1).Value = "文字" ElseIf .Value > 0 Then .Offset(0, 1).Value = "正数" ElseIf ActiveCell.Value < 0 Then .Offset(0, 1).Value = "負数" Else .Offset(0, 1).Value = "その他" End If .Offset(1).Activate i = i + 1 Application.StatusBar = i Loop End With End Sub

  • VBAプログラムについて

    VBAプログラムを本を見ながら作成していますが、はっきりいって素人です。 本に載っていないこととなるとちんぷんかんぷんで、いくつかあるプロシージャのどのプロシージャ内に記入したら良いのか分からないし、新しいプロシージャをどこに記入して良いのか分かりません。 例えば、 ----------------------------------------------------------- Private Sub CommandButton1_Click() ActiveCell.Value = TextBox1.Value ActiveCell.Offset(0, 1).Value = TextBox2.Value ActiveCell.Offset(0, 2).Value = TextBox3.Value ActiveCell.Offset(0, 3).Value = TextBox4.Value ActiveCell.Offset(0, 4).Value = TextBox5.Value ActiveCell.Offset(0, 5).Value = TextBox6.Value ActiveCell.Offset(0, 6).Value = TextBox7.Value ActiveCell.Offset(0, 7).Value = TextBox8.Value ActiveCell.Offset(0, 8).Value = TextBox9.Value ActiveCell.Offset(1, 0).Activate End Sub Private Sub CommandButton2_Click() Unload Me End Sub Private Sub Label1_Click() End Sub Private Sub UserForm_Click() End Sub Private Sub UserForm_Initialize() Range("A2").Activate End Sub ---------------------------------------------------------- テキスト入力フォームをいくつか作っており、コマンドボタン1とコマンドボタン2で入力ボタンと閉じるボタンにしています。   このプログラムでは、入力ボタンをクリックすることでデータが入力されて、入力された列のすぐ次の列の最初のセルがアクティブな状態になります。 (1)データ入力済みのエクセルシートにおいて、アクティブな状態にしたセルや列を削除したい場合、どこにどのように書けば良いのでしょうか? (2)データ入力が一度に終わらない時、途中の任意の列から入力を始めたい場合はどこにどのように書けば良いのでしょうか? 本に書かれていることは丸写しできますが、ちょっとでも違うと壁にぶつかってしまいます。 独学で勉強する時に良いと思われる方法はどんな方法なのでしょうか? おこがましいですが素人も分かりやすい説明をして頂けると助かります。 宜しくお願いします。

  • VBA:Offsetから値が貼付けれない

    はじめまして。 VBAを利用してマクロを作っているのですが、 Range("a6:l6").Copy Worksheets("結果シート").Range("A65536").End(xlUp).Offset(1) というのは動くのですが、結果シートへの貼付けを「値」で行いたいと思い、 以下の通りValueを指定しても動きません。 Range("a6:l6").Copy Worksheets("結果シート") .Range("A65536").End(xlUp).Offset(1).value PasteSpecialを使うと良いのかと思い、 Range("a6:l6").Copy Worksheets("結果シート") .Range("A65536").End(xlUp).Offset(1).PasteSpecial Paste:=xlPasteValues としてもエラーが出ます。 数式の結果を取得して、別のシートの空白セルを探し、「値」として張付ける。 というのがしたいのですが、なにか上手い方法があれば、ご教授お願いします。

  • Filter関数を用いた結果、何も検索されなかった場合

    Filter関数を用いた結果、何も検索されなかった場合 以下のプログラムを実行したところ、セルはまっさらのまま。   Sub Macro3()     Dim a As Variant     a = Array(1, 2, 3, 4, 5)     ActiveCell.Value = Filter(a, 8)   End Sub そこで   If Filter(A,8) = "" Then ・・・(1)     ActiveCell.Offset(1, 0).value = False   Else表示     ActiveCell.Offset(1, 0).value = True   endif を書き加えてみましたところ、   実行時エラー'13':   型が一致しません とのエラーが出ます。 (1)を   If ActiveCell.value = "" Then と書く分には問題ないのですが、だからと言って、Filter(A,8)の値は""で表せないのですね。 とりあえずこの五行はエラーが出ているので削除しました。 次に   ActiveCell.Offset(1, 0).Value = IsEmpty(Filter(A, 8)) を書き加えると、アクティブセルの一つ下は「False」となります。Filter(A,8)では何も抽出されないのですから、空か否かを問われたら「True」のはずなのですが・・・やはり何か戻り値があるのですね・・・ ではエラー値が戻っているのかと   ActiveCell.Offset(2, 0).Value = IsError(Filter(A, 8)) を書き加えると、「False」ですからエラー値ではありません。   If Filter(A,8) = Null Then ・・・(2)     ActiveCell.Offset(3, 0).value = False   Else表示     ActiveCell.Offset(3, 0).value = True   endif を書き加えたところ、またも   実行時エラー'13':   型が一致しません とのエラーが出ます。 (2)を   If Filter(A,8) = Error Then と書き換えてみても同じです。 試しに(2)を   If Cvar(Filter(A,8)) = Null Then としてみたり   If Filter(A,8) = Cvar(Null) Then としてみたり   If Cvar(Filter(A,8)) = Cvar(Null) Then としてみたりしましたが、同じエラーが出ます。 Ubound(Filter(A,8)の値は-1です。これをもってこの場合の戻り値とするしかないのでしょうか。filter関数の戻り値が分からないからUbound関数を使っていることがモロばれで、嫌なんです。   If Filter(A,8) = なんとか Then のなんとかに入る戻り値をどなたか教えてください。

  • excel vbaでの質問になります

    このようなマクロを作成したのですが、セルに数式が入れてあると、どうしてもその下の空白の行に値を入力されてしまいます。 数式が入っているセルにもそのままセルに値を入れたいのですが・・ 宜しくお願いします。 Dim wb1 As Worksheet, r1 As Range Dim N As Integer, i As Integer Dim mycount As Long   Set wb1 = ThisWorkbook.Worksheets("請求書") mycount = Range("B111").CurrentRegion.Rows.Count Cells(111 + mycount, 2).Select ActiveCell.Offset(0, 0).Value = wb1.Range("C60").Value ActiveCell.Offset(0, 1).Value = wb1.Range("C61").Value ActiveCell.Offset(0, 12).Value = wb1.Range("C66").Value ActiveCell.Offset(0, 13).Value = wb1.Range("C74").Value ActiveCell.Offset(0, 14).Value = wb1.Range("C75").Value ActiveCell.Offset(0, 15).Value = wb1.Range("C84").Value ActiveCell.Offset(0, 16).Value = wb1.Range("C85").Value ActiveCell.Offset(0, 20).Value = wb1.Range("C69").Value ActiveCell.Offset(0, 22).Value = wb1.Range("C68").Value ActiveCell.Offset(0, 23).Value = wb1.Range("C76").Value ActiveCell.Offset(0, 24).Value = wb1.Range("C77").Value Exit Sub

  • エクセルマクロが重い

    こんにちは。 ご教授くださいませ。 すでに先方が作っているエクセルのシートがありまして、 そのシートの表組み規則にのっとって入力するユーザーフォーム を私のほうで作ったのですが、重いです。 selectの多用はだめ!というところまでは調べたのですが じゃあどうしたらいいかわかりません。 ■ '--------------------8時から If OptionButton1.Value = True Then ActiveCell.Offset(3, -1).Range("A1").Select ActiveCell = UserForm3.TextBox1.Value ActiveCell.Offset(0, 1).Range("A1").Select ActiveCell = UserForm3.TextBox2.Value ActiveCell.Offset(0, 1).Range("A1").Select ActiveCell = UserForm3.TextBox3.Value ActiveCell.Offset(0, 1).Range("A1").Select ActiveCell = UserForm3.TextBox4.Value ActiveCell.Offset(0, 1).Range("A1").Select ActiveCell = UserForm3.TextBox5.Value ActiveCell.Offset(0, 1).Range("A1").Select ActiveCell = UserForm3.TextBox6.Value ActiveCell.Offset(3, 0).Range("A1").Select ActiveCell = UserForm3.TextBox12.Value ActiveCell.Offset(0, -1).Range("A1").Select ActiveCell = UserForm3.TextBox11.Value ActiveCell.Offset(0, -1).Range("A1").Select ActiveCell = UserForm3.TextBox10.Value ActiveCell.Offset(0, -1).Range("A1").Select ActiveCell = UserForm3.TextBox9.Value ActiveCell.Offset(0, -1).Range("A1").Select ActiveCell = UserForm3.TextBox8.Value ActiveCell.Offset(0, -1).Range("A1").Select ActiveCell = UserForm3.TextBox7.Value ActiveCell.Offset(3, 0).Range("A1").Select ActiveCell = UserForm3.TextBox13.Value ActiveCell.Offset(0, 1).Range("A1").Select ActiveCell = UserForm3.TextBox14.Value ActiveCell.Offset(0, 1).Range("A1").Select ActiveCell = UserForm3.TextBox15.Value ActiveCell.Offset(0, 1).Range("A1").Select ActiveCell = UserForm3.TextBox16.Value ActiveCell.Offset(0, 1).Range("A1").Select ActiveCell = UserForm3.TextBox17.Value ActiveCell.Offset(0, 1).Range("A1").Select ActiveCell = UserForm3.TextBox18.Value ActiveCell.Offset(3, 0).Range("A1").Select ActiveCell = UserForm3.TextBox24.Value ActiveCell.Offset(0, -1).Range("A1").Select ActiveCell = UserForm3.TextBox23.Value ActiveCell.Offset(0, -1).Range("A1").Select ActiveCell = UserForm3.TextBox22.Value ActiveCell.Offset(0, -1).Range("A1").Select ActiveCell = UserForm3.TextBox21.Value ActiveCell.Offset(0, -1).Range("A1").Select ActiveCell = UserForm3.TextBox20.Value ActiveCell.Offset(0, -1).Range("A1").Select ActiveCell = UserForm3.TextBox19.Value ActiveCell.Offset(3, 0).Range("A1").Select ActiveCell = UserForm3.TextBox25.Value ActiveCell.Offset(0, 1).Range("A1").Select ActiveCell = UserForm3.TextBox26.Value ActiveCell.Offset(0, 1).Range("A1").Select ActiveCell = UserForm3.TextBox27.Value ActiveCell.Offset(0, 1).Range("A1").Select ActiveCell = UserForm3.TextBox28.Value ActiveCell.Offset(0, 1).Range("A1").Select ActiveCell = UserForm3.TextBox29.Value ActiveCell.Offset(0, 1).Range("A1").Select ActiveCell = UserForm3.TextBox30.Value 'ActiveWorkbook.Save MsgBox "入力しました。", vbInformation, "確認" End If '--------------------8時から(END ■ 基本の流れは... 最初にオプションボタン3つのどれか1個の 選択を求め、その条件に応じて 始基点となるセルが変わります。 で、あとは与えられた表組みを縦や横に 移動しながら、対応するテキストボックスの 値を入れる、という 我ながら頭の悪い方法で^^; .selectではない、スマートな方法があればと思います。 ぜひお知恵を!

  • VBAでVLOOKUP関数を使う

    「在庫検索」に下記条件を追加するには、どうすれば良いのでしょうか。 1)G列が1500より大きければ Results = Application.WorksheetFunction.VLookup(ItemCode, SerchArea, 2, False) 2)G列が1500より小さければ Results = Application.WorksheetFunction.VLookup(ItemCode, SerchArea, 3, False) どちらの際も空白の条件、If ActiveCell.offset(i, 1).value = ""は残ります。 1)、2)とandを組み合わせる方法でチャレンジしたのですが、出来ませんでした。 ------------------------------------------------------------------------ 以下がベースの「在庫検索」です。 一度、質問して解決したのですが、更なる問題が発生してしまいました。 ご指導ください。 ------------------------------------------------------------------------ Sub 在庫数検索() Dim SerchName As String Dim SerchArea As Range Dim Results As Variant '初期設定 Range("A2").Activate ItemCode = Range("A2").Value i = 0 '検索範囲の設定(ポイント1) Set SerchArea =Worksheets("シート2").Range("List1") '商品コードが空になったら終わり Do Until ItemCode = "" If ActiveCell.offset(i, 1).value = "" Then '★1 On Error Resume Next ItemCode = ActiveCell.offset(i, 0).value Results = Application.WorksheetFunction.VLookup(ItemCode, SerchArea, 2, False) If Err <> 0 Then Results = "" ActiveCell.offset(i, 1) = Results End If '★1 i = i + 1 Loop

  • Excel2003VBA offsetの考え方

    たとえば、 A1にカーソルがあってActiveCell.Offset(0,1)であればB1を表示することになると思うのですが、なぜ、このオフセットは、先に行で次が列なのでしょうか? たとえば、数学ですとグラフの座標は(x軸,y軸)となっている方がわかりやすいと思うのですが、合理的な考え方があればお教えください。

専門家に質問してみよう