• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:任意の整数まで欠番行を挿入するマクロは?)

任意の整数まで欠番行を挿入するマクロは?

このQ&Aのポイント
  • エクセルのSheet1のA列の1行目から下の行へ1から1000まで数字(整数)が入っているとします。
  • 欠番を挿入して行を増やしたいのですが、任意の整数(下二桁が同じ整数)まで挿入したら次の桁へ飛んで、また同じ任意の整数(下二桁が同じ整数)まで来たら次の桁へ飛んでという具合に、これらを繰り返したいのです。
  • 例えば、1から46まで、100から146まで、200から246まで、300から346までという具合です。

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

  • ベストアンサー
  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.4

> 100までは49までの欠番が挿入され、100以上は何も変化がありませんでした。 質問では46まででしたし、テストが甘かったみたいで、ちゃんと動かなかったですね。 以下のように変更してみてください。 Sub 欠番挿入() Dim i As Integer, myAnyValue As Integer myAnyValue = 46 For i = 0 To 999 If ActiveSheet.Range("a1").Offset(i, 0).Value = "" Then Exit Sub End If ActiveSheet.Range("a1").Offset(i, 0).Activate If i <> 0 Then If ActiveCell.Value - ActiveCell.Offset(-1, 0) <> 1 _ And ActiveCell.Offset(-1, 0).Value < myAnyValue Then Rows(ActiveCell.Row).Insert ActiveCell.Value = ActiveCell.Offset(-1, 0).Value + 1 End If End If If i = myAnyValue Then myAnyValue = myAnyValue + 100 i = Int(myAnyValue / 100) * 100 - 1 End If Next End Sub

paraseke
質問者

お礼

本当にいろいろと対応していただき感謝申し上げます。A列に連番を入れて試しましたが、やはり100以上の数字に関しては欠番が挿入されませんでした。このコードをもとに解決策を探ってみたいと思います。本当にありがとうございました。

paraseke
質問者

補足

今回も早々のご回答ありがとうございます。私の説明の仕方が悪かったようで、、、すみません。いただいたコードは1から46までの欠番はうまく挿入されました。私のやりたかったのは、1から46まで挿入したら、次は100から146まで、次は200から246まで、次は300から346までという具合に、A列の最後の行まで入っている数字(およそ1000まで)について、次の「くらい」に飛んで下2桁が46になるように欠番を挿入するものです。もし可能であればご提示いただけませんか。よろしくお願い申し上げます。

その他の回答 (8)

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.9

> 何か改善策はありますか。 こちらでは正常に動くので こちらでは手の加えようがありません。 そんなに難解なコードではありませんから ご自身でコードの流れをつかんでいただいて どうして100以上でできないのかはご自身で改善してください。 いちど単純なA列だけの連番を作成したファイルを作成してテストしてみてもいいでしょう。

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.8

> >100から146までの欠番はすべて146に > 200から246までの欠番はすべて246に > ということでしょうか? > > そのとおりです。可能ですか。よろしくお願い申し上げます。 そのとおりと書いていますが、あなたはこの文章をどう理解したのか聞かせてもらえますか。 すべて146すべて246と書いているのにどう理解したのでしょうか? その前に > 次の「くらい」に飛んで下2桁が46になるように欠番を挿入するものです 下2桁が46になるようにと書いているのはあなた自身ですよ。 日本語ちゃんと理解してちゃんと日本語を書いてください。 また、 > 46という行がやたら多く挿入されました。 46という行ですか、100の位はなかったんですか? そのように作った覚えはありませんが あなたのエクセルどこかおかしいんじゃないですか?

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.7

> 行いたいのは1,2,3,4…43,44,45,46までの整数行を挿入、 > 101,102,103,104…143,144,145,146までの整数行を挿入、 > 201,202,203,204…243,244,245,246までの整数行を挿入、 > 301,302,303,304…343,344,345,346までの整数行を挿入 No4のコードでそうなるはずなのですが…No4を試してみてできないと言ってるんですよね。 x46以降の連番についてはなにもしないということで たとえば 346以降 347,350,351と飛び番があっても無視してそのままです。

paraseke
質問者

補足

何度もすみません。ネットだどうまく伝わらなくて失礼な補足を出していたら申し訳ありません。 No4のコードで100までの数字についてはできているのですが、やはり100以上の数字についてはなにも起こりません。(1から46までは欠番が挿入されました。)私のエクセルが変なのでしょうか? >x46以降の連番についてはなにもしないということで  たとえば 346以降 347,350,351と飛び番があっても無視してそのままです。 これはおっしゃるとおりでOKです。 何か改善策はありますか。

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.6

> そのとおりです。可能ですか。よろしくお願い申し上げます こういうことでしょうか… Sub 欠番挿入() Dim i As Integer, myAnyValue As Integer myAnyValue = 46 For i = 0 To 999 If ActiveSheet.Range("a1").Offset(i, 0).Value = "" Then Exit Sub End If ActiveSheet.Range("a1").Offset(i, 0).Activate If i <> 0 Then If ActiveCell.Value - ActiveCell.Offset(-1, 0) <> 1 _ And ActiveCell.Offset(-1, 0).Value < myAnyValue _ And ActiveCell.Offset(1, 0).Value <> myAnyValue Then If ActiveCell.Value > 99 Then For j = 1 To ActiveCell.Value - ActiveCell.Offset(-1, 0) - 1 Rows(ActiveCell.Row).Insert ActiveCell.Value = myAnyValue Next Else Rows(ActiveCell.Row).Insert ActiveCell.Value = ActiveCell.Offset(-1, 0).Value + 1 End If End If End If If i = myAnyValue Then myAnyValue = myAnyValue + 100 i = Int(myAnyValue / 100) * 100 - 1 End If Next End Sub

paraseke
質問者

補足

今回も回答をありがとうございます。懸命に答えてくださるので恐縮しています。 試してみましたが、すみませんうまく伝わらなかったようでした。試してみたら、46という行がやたら多く挿入されました。 行いたいのは1,2,3,4…43,44,45,46までの整数行を挿入、101,102,103,104…143,144,145,146までの整数行を挿入、201,202,203,204…243,244,245,246までの整数行を挿入、301,302,303,304…343,344,345,346までの整数行を挿入という具合に行をどんどん挿入し、A列の最後の数字が入っている行まで挿入し続けるというものです。いかがしょうか。

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.5

> 私のやりたかったのは、1から46まで挿入したら、次は100から146まで、 > 次は200から246まで、次は300から346までという具合に、 > A列の最後の行まで入っている数字(およそ1000まで)について、 > 次の「くらい」に飛んで下2桁が46になるように欠番を挿入するものです。 100以上でもX46までは連番として挿入されるのですが…。 100から146までの欠番はすべて146に 200から246までの欠番はすべて246に ということでしょうか?

paraseke
質問者

補足

回答ありがとうございます。 >100から146までの欠番はすべて146に 200から246までの欠番はすべて246に ということでしょうか? そのとおりです。可能ですか。よろしくお願い申し上げます。

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.3

> ご回答ありがとうございます。とてもシンプルで美しいのですが、完全なコードでご教授いただけませんか。 以下のような状態でいかがでしょう。 Sub 欠番挿入() Dim i As Integer, myAnyValue As Integer myAnyValue = 46 For i = 1 To 1000 If ActiveSheet.Range("a2").Offset(i, 0).Value <> "" _ Or ActiveSheet.Range("a2").Offset(i, 0).Value <= myAnyValue Then If ActiveSheet.Range("a2").Offset(i + 1, 0).Value = "" Then Exit Sub End If ActiveSheet.Range("a2").Offset(i, 0).Activate If ActiveCell.Value - ActiveCell.Offset(-1, 0) <> 1 Then Rows(ActiveCell.Row).Insert ActiveSheet.Range("a2").Offset(i, 0).Value _ = ActiveCell.Offset(-1, 0).Value + 1 End If End If If i = myAnyValue Then myAnyValue = myAnyValue + 100 i = Int(myAnyValue / 100) * 100 - 1 End If Next End Sub

paraseke
質問者

補足

ご回答ありがとうございます。A列に適当な数字を下へ割り振って試してみたが、100までは49までの欠番が挿入され、100以上は何も変化がありませんでした。その後私もこのコードを少しいじったのですが、どうやらうまくいきません。もし可能であれば手を加えていただき、修正してもらえると大変助かります。よろしくお願い申し上げます。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.2

処理をする発想(ロジックという)は色々在る。 経験では、行挿入法は、処理に時間がかかるように思うし、ロジックも難しく成りがち。 ーー それで別シートに実現法を考えた。 例データ Sheet1  A2:D6  D列までの例 A列に数字の番号有りとする。 1 a aa aaa 3 b bb bbb 6 c cc ccc 9 d dd eee 4 x xx xxx 番号順で無くても良い。 ーーーー 結果 Sheet2 A2:D31 1 a aa aaa 2 3 b bb bbb 4 x xx xxx 5 6 c cc ccc 7 8 9 d dd eee 10 ・・・ 11行目以下掲載略 === コード 標準モジュールに Sub test01() Dim sh1, sh2 As Worksheet Set sh1 = Sheets("Sheet1") Set sh2 = Sheets("Sheet2") '---A2セルから連番を振る。例として番号を30までにしている。下記のA31は、必要番号の数に寄り適宜考えて。 sh2.Range("A2") = 1 sh2.Range("A2:A31").DataSeries Rowcol:=xlColumns, Type:=xlLinear, Date:=xlDay, _ Step:=1, Trend:=False '---Sheet1からSheet2ヘコピー d = sh1.Range("A65536").End(xlUp).Row MsgBox d For i = 2 To d n = sh1.Cells(i, "A") '番号 MsgBox n sh1.Range("A" & i & ":x" & i).Copy sh2.Cells(n + 1, "A") 'Sheet2のしかるべき行に貼り付け Next i End Sub データ列は最多でX列までと仮定

paraseke
質問者

補足

お礼が遅くなりすみません。ご回答ありがとうございます。発想がとても豊かで、思いつきませんでした。ボックスが出てくるのでひたすらEnterキーを押し続けました。そしたら、B列からD列までの値がShhet2に反映されました。ありがとうございます。ただし、1から46までいったら100へ飛んで146まで欠番挿入し、そしてさらに200へ飛んで246まで欠番挿入し…という具合にはうまくいきませんでした。困りました。

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.1

> 例えば、1から46まで、100から146まで、200から246まで、300から346までという具合 たとえば以下のようなことで可能です。 myAnyValue = 46 For i = 1 To 1000 'やりたいことのコード If i = myAnyValue Then myAnyValue = myAnyValue + 100 i = Int(myAnyValue / 100) * 100 - 1 End If Next

paraseke
質問者

補足

ご回答ありがとうございます。とてもシンプルで美しいのですが、完全なコードでご教授いただけませんか。自分が提示したものに、回答いただいたコードを加工編集したいのですがうまくいきません。よろしくお願い申し上げます。