• ベストアンサー

VBA

VBAでCells(1,1)=1と書いて、 エクセルシートの行や列の挿入をすると、 1を書き込みたいセルの位置がずれるのですが、Cells(1,1)=1をCells(2,2)=1とかに 自動的書き換えることは出来ないのでしょうか?

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

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.1

例えば目標のA1セルに例えばTargetと名前を定義しておき range("Target") = 1 とでもしておくと、対象セルに追従します。 >Cells(1,1)=1をCells(2,2)=1とかに自動的書き換える マクロの文面そのものが勝手に書き換わるなんて機能はありません。

miya2004
質問者

お礼

ありがとうございました。 セルに名前を付けとけば良いのですね。 良いことを聞きました。

その他の回答 (2)

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.3

#2、cjです。お礼欄へのレスです。 > 使用する行と列に > 行1、行2.....、列1、列2... > と名前を付ければ、 > 行列を挿入しても追従するように出来るのでしょうか? はい。 #1で提示した [初期設定_名前定義」、[実行8299761]では、   [初期行2] ~ [初期行21]   [初期列2] ~ [初期列15] という名前にしています。 これを   [行2] ~ [行21]   [列2] ~ [列15] になるように("初期行"を"行"に置換する要領で)書き換えてみて、実行後、 [名前の管理]で確認してみれば、お解りになるかと。 ただ、どんな名前を選ぶか、は、どんな運用をするか、 に掛かってくると思いますし、 行列の挿入があると、[行2]が2行め以外を指すという妙、 というか一種の不整合で混乱してしまう場合もあるかも知れません? ので、命名は慎重に決めたいですね。 という訳で、オマケ。 Sub 名前定義削除()   Dim oName As Name   For Each oName In ActiveSheet.Names '  For Each oName In ActiveWorkbook.Names     oName.Delete   Next End Sub

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.2

こんにちは。お邪魔します。 既に必要な回答は得られているものと思いますし、 名前の定義を使うという意味では、#1さんと同趣旨ですので、こちらは参考回答です。 Range の引数に指定する参照文字列に、スペース演算子を使って、 参照文字列をクエリっぽく使う例を紹介します。 まず、解説から。   Range("D:D")  は、列 D   Range("5:5")  は、行 5 と、ここまでは普通ですが、 ここで、スペース演算子を使うと、   Range("D:D 5:5")  は、セル範囲 D5 になります。 要するに、 スペース演算子の前後で指定した2つのセル範囲、に共通するセル範囲を指定する、ということです。   Range("フィールド4")  は、列 D   Range("レコード5")  は、行 5 事前に設定した名前の定義が、上↑のようなセル参照になっているなら、スペース演算子を使うと、   Range("フィールド4 レコード5")  は、セル範囲 D5 という風にセル範囲を指定することが可能です。 名前の定義は、行、列、の挿入後も、最初に設定した参照先を追いかけてくれます。 以下、新規のシートで、 [初期設定_名前定義]→[行列無作為挿入]→[実行8299761]の順に 実行し、試してみてください。 ' ' =================================== Sub 初期設定_名前定義()  '  システムとして事前に、名前の定義を用意しておく   Dim i As Long   Cells.Clear ' ' とりあえず、元の番地が判るようにセル値を設定   With Range("A1:O21")     .Formula = "=""○""&CHAR(64+COLUMN())&ROW()"     .Value = .Value     .EntireColumn.AutoFit   End With   Range("B2:O21").Interior.ColorIndex = 36 ' ' 名前の定義で、以下を設定 ' '  [初期行2] - [初期行21] ' '  [初期列2] - [初期列15]   With ActiveSheet     For i = 2 To 21       .Names.Add Name:="初期行" & i, RefersToR1C1:="=R" & i     Next i     For i = 2 To 15       .Names.Add Name:="初期列" & i, RefersToR1C1:="=C" & i     Next i   End With '  MsgBox "初期設定_名前定義、完了" End Sub ' ' ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー Sub 行列無作為挿入()  '  行、列、をランダムに挿入(想定:ユーザーによる編集)   Dim cn As Long   Dim i As Long   For i = 21 To 3 Step -1     If Int(Rnd * 7) = 1 Then       cn = cn + 1       Rows(i).Insert       With Rows(i).Resize(, 15)         .Value = "◇◇◇"         .Interior.ColorIndex = 39       End With     End If   Next i   For i = 15 To 3 Step -1     If Int(Rnd * 4) = 1 Then       Columns(i).Insert       With Columns(i).Resize(21 + cn)         .Value = "◇◇◇"         .Interior.ColorIndex = 35       End With     End If   Next i '  MsgBox "行列無作為挿入、完了" End Sub ' ' ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー Sub 実行8299761()  '  初期設定時の番地に値を設定する   Dim i As Long   Dim j As Long   For i = 2 To 21     For j = 2 To 15       Range("初期行" & i & " " & "初期列" & j).Value = "元・" & Chr(64 + j) & i     Next j   Next i End Sub ' ' =================================== 初期設定時の番地を正しくトレースできていることは確認できることと思います。 まぁ、でも、実際試してみると感じると思いますが、 サンプルのように一様に名前を定義してループして使うのは、 処理が遅く(原因はNameの呼び出しが遅いこと)、使いものにならないとは思います。 (これはあくまでも例示ですので。) 実用を意識するなら、 特定のデータを拾い上げるのに、行、列の挿入の影響を受けない、 という意味では、結構有用だったりします。 実用的な例でいえば、名簿テーブルで、   [佐藤1]さんの[メールアドレス]   [田中]さんの[メールアドレス] を取得するには、   [佐藤1]、[田中]の行、[メールアドレス]の列 を名前の定義で事前に設定しておけば、   Range("佐藤1 メールアドレス").Value   Range("田中 メールアドレス").Value のように取得できますから、いちいち探さなくとも 簡潔な記述で済ませられるようになったりします。 俄かにはピンと来ないと思いますので、お暇な時にでも試してみて、 何かの機会に応用できる場面を見つけられたらいいなぁ、という程度の参考回答です。 /// # すみません、この場をお借りします。 /// # 突然ですが、keithin 様、 # その節はお世話になり、ありがとうございました。 # ところで、新設されたカテゴリ「Excel」の方にもご参加頂けること、 # 勝手ながら期待致しておりまする。 /// # お邪魔しました。

miya2004
質問者

お礼

ありがとうございます。 使用する行と列に 行1、行2.....、列1、列2... と名前を付ければ、 行列を挿入しても追従するように出来るのでしょうか?

関連するQ&A

  • VBA エクセル2000でハイパーリンクをはる

    アクティブなワークシートの特定セル(行位置、列位置 一定)と他のワークシートの不定セル(行位置、列位置 とも、或いは、どちらか、 が変数)間にハイパーリンクをはりたい 実現したいことは至ってシンプルでセル間をジャンプ可能となればOK、です 例えばWorksheet「アクティブ」のCells(固定行位置,固定列位置)と Worksheet「他のシート」のCells(変数行位置,変数列位置)、両変数はその時点でプログラム(マクロ)が獲得済み、間にハイパーリンク(出来たら往復)をはるコードはどういうものになるでしょうか? うまく説明できているか、自信はありませんが何とか教えて頂きたくお願い致します

  • VBAについて教えて下さい

    エクセルのファイルを2つ開いている状態で 仮に名前を試験1、試験2とします。 VBAを使用し 試験2の指定した位置にあるセル(数値)を 試験1の任意の位置に挿入する しかし、試験2のシートは複数あります。 僕がやりたいのは 試験1の任意の位置に挿入する数値は 試験2のシートが変わっていようが 今開いているシートから指定した位置にあるセルから数値を挿入してほしいのです いちいち、VBAを使いwooksheetsで指定するのも面倒なので質問しました。 なにか、別の方法あるでしょうか? あれば、コード書いて貰えるととても助かります。

  • エクセルのVBAでFor文がわかりません。

    エクセルのVBAで 12列目のセルで縦に93行あるデータ(数字)を利用し、 まずCells(1,12)のデータを18列目のセルの28~36に貼り付け 次はCells(2,12)のデータを18列目のセルの28+48~36+48に貼り付け その次はCells(3,12)のデータを18列目のセルの28+48*2~36+48*2に貼り付け ・ ・ ・ 最後はCells(93,12)のデータを18列目のセルの28+48*92~36+48*92に貼り付け という具合にFor文を作りたいのですがわかりません。 For文を二つ用いて関数二つあれば出来そうなのですが・・・。 ご教授お願いいたします。

  • vbaにて並べ替えしたい。

    並べ替えするには? ただいまVBA学習中です。 sheet1に次のような文字列がセルに入力されているとします。 3列で30行あります。   A列 B列 C列 1行 あ  い  う 2行 え  お  か ...以下30行まで続く。 これらを sheet2に A列 あ い う え お か のようにひとつの列へ縦にするにはどのような記述になりますか? 私なりの考え方ですが セルのスタート位置はシート1のA1とします。  シート1にて  ・あ い う と順番に配列に格納  ・セルを左に2つ下に1つ移動   この動作を30回繰り返す(for next 使えばでいいですよね?)  シート2に移動してA1から下方向へ  格納された文字列を入力する。  と、考えてみたものの記述の仕方がわかりません。 力貸してください。   

  • エクセルVBAにてCells(1)とは、

    エクセルVBAにてCells(1)とは、 1行のことでしょうか? それとも1列のことでしょうか? ご存知の方教えてください。

  • VBAの操作

    ↓の事を行いていのでうまくいきません。 アドバイスをお願いできませんか? 変更前(Sheet1); (A列) (B列) 1 ABC010 Data_010 2 ABC020 (同上) 'B1-B2は結合セル 3 ABC030 Data_020 4 ABC040 (同上) 'B3-B4は結合セル . . 変更後(Sheet2); (A列) (B列) 1 ABC010 "OK" 2 ABC020 "OK" 3 Data_010 "Comp" '追加行 4 ABC030 "OK" 5 ABC040 "OK" 6 Data_020 "Comp" '追加行 . . Sheet1(B列)に値があれば、 Sheet2(A列)に結合セルの単位で値をコピーする。 Sheet2(B列)には"OK"コメント その都度、必ず最後に行追加して結合セルの値、"Comp"コメントをコピーする. 現象は毎行、追加行が挿入されてしまいます。 Sub testVBA() Dim i Worksheets("Sheet1").Range("A:B").Copy With Worksheets("Sheet2") .Range("A1").PasteSpecial For i = 1 To 1000 If .Cells(i, 2) <> "" Then .Cells(i + 1, 1) = .Cells(i, 2) .Cells(i + 1, 2) = "Comp"   .Cells(i, 2) = "OK" End If Next i End With End Sub

  • EXCEL VBAについて

    EXCEL VBAについて教えてください やりたいことは以下の通りです。 ・全シートJ列1~100行目を検索しアルファベットが含まれるセルが存在すれば 上のセルをコピーする ここまで作ったのですが上手くいきません Sub VBAsample() Dim GYO As Long For GYO = 1 To 100 If Find([a-z], LookAt:=xlPart) Then Cells(GYO, 10).Value = Cells(GYO - 1, 10).Value End If Next GYO End Sub 添削をお願いします

  • エクセル VBA

    最終行から順番に下へ同列で入力するVBAを教えて下さい。 EXCELのVBAで教えて下さい。 シート1のA列にはB列が入力されると自動入力されるNo.があり、C~G列もB列が入力されると自動入力されます。 B列には日付が、H列には3~4桁の数字が入力したいのですが、 入力行は必ず最下行のセルB、Gな為、VBAでフォームを作成し、 入力実行ボタンを押すことにより、最下行のセルB、Gに反映されるように したいです。 又、上記入力後に、シート2のH~N列をコピーして、シート3のA~G列に値のみの貼り付けを行い保存した後、シート3のA~G列をコピーして csvファイルを作成して保存したいです。 一連の流れを、フォームの入力実行ボタンを押すことで実行したいのですができるのでしょうか? 宜しく御願い致します。

  • VBAのプログラムでうまく動かなくて困っています。

    VBA初心者です。 エクセルのVBAのプログラムでうまく動かなくて困っています。教えていただける方がいらしたら、ぜひ教えて下さい!よろしくお願いします。エクセルの内容は以下のとおりです。 (内容) セル    E H J L N P R・・・ 8行目100 200 50 40 30 80 9行目130 350 10 50 60 120 110 ・ ・ (1)列Hの値が列Eの値より大きい場合その下に行を追加します。 (2)セルJ+セルL+セルN+・・をしてセルEの値を超えたセル以降の値を追加した行のセルJ列から順にコピペする処理です。 上のセルの1行目の内容でいいますと、 (1)列Hの値「200」が列Eの値「100」より大きいのでその下に行追加 (2)セルJ、L、N「50」+「40」+「30」でセルEの値「100」より大きいので、追加した行のセルJ列にセルN、Pの値をコピペするです。 以下が私が書いたプログラムです。 Sub test() Dim x As Integer Dim s As Integer Dim t As Integer x = Range("B8").End(xlDown).Row r = Range("J8").End(xlToRight).Column '8行目から最終行までループ For i = x To 9 Step -1 If Cells(i, 5) < Cells(i, 8) Then ☆【For r = y To 11 Step -2 Cells(s, t).Value = Cells(i, r) + Cells(i, r + 2) If Cells(i, 5).Value < Cells(s, t).Value            Then Exit For Next】 Rows(i + 1).Insert Shift:=xlDown '超えたセルをコピーして、1行下の"J列以降"に代入 ★ x = x + 1 End If Next i End Sub 上記プログラムで★の部分がうまく書けません。☆の部分も間違っているような気がします。よろしくお願いします。

  • VBAでi行j列ずれたセルの値

    VBAでセルA1にTESTという名前を定義しているとします。 セルA1はRange("TEST")で値を取得できますが、 セルA1からi行j列ずれたセルの値はどうやって取得できるのでしょうか? 今までは、Cells(1+i,1+j)で取得していましたが、 行や列を挿入することもあるので、セルに名前を付けたいと思います。

専門家に質問してみよう