質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

3回答

2042閲覧

VBAでデータを別シートへ転記、途中から1行目へ戻り上書きしたい

neko_coffee

総合スコア0

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

1クリップ

投稿2020/08/06 04:06

編集2020/08/06 06:27

初学者なため思いつかず… もしかしたら簡単なことかもしれないのですが…
ぜひ知識を与えていただきたいです…!

■やりたいこと
元データC2~4は都度内容が異なり、それを前回Saveした次の位置に転記したい。
100行分使い切ったら元に戻って先頭から上書きさせたい。

(追記)※やりたいことの流れです※
C2,C3,C4に入力→登録→別シートA2,B2,C2へ転記→
C2,C3,C4に入力→登録→別シートA3,B3,C3列へ転記→
C2,C3,C4に入力→登録→別シートA4,B4,C4列へ転記→
・・・
C2,C3,C4に入力→登録→別シートA101,B101,C101列へ転記→
C2,C3,C4に入力→登録→別シートA2,B2,C2列へ転記→

■シートについて
シート"表"とシート"入力"の二枚が存在します。

シート"表":C2,C3,C4に値を入力する欄と登録ボタンがある
シート"入力":セルA2~A101までの転記先となる一覧表がある

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

DreamTheater

2020/08/06 04:11

空欄チェックとは何者でしょうか? それが条件なら「やりたいこと」に明記しましょう。
mako1972

2020/08/06 04:25 編集

最近の質問者は、転記シートに転記すればいいだけなのに 空欄がどうのこうの記述する方が多いように気がします。 なにか書籍の影響なのでしょうか・・。
neko_coffee

2020/08/06 04:44

空欄チェックはやり方が思いつかず至った結果で、やりたいことではないので全く無視して頂いて大丈夫です…!転記されているかどうかチェックしてされていなければ転記、されていれば次の行へ転記、という思考でこうなりました。 どういった方法があるかぜひご教示頂きたいです…
yureighost

2020/08/06 04:50

空欄チェックは多分 If Sheets("表").Range("A" & i).Value = "" Then のことを言ってるんだと思いますけど。 値がない状態でないと転記にいかないので、 上からやり直した時に上書きできないと言ってるんでしょうね。 ただ今のところは正に説明とソースそのままで、そうなりますよとしか答えようがない。 どういう条件で上書きしたいのかはちゃんと考えをまとめてきてください。
mako1972

2020/08/06 04:51 編集

サンプルだと思うのでどうでもいいことだと思いますが、例えば、最終行から始めるとかなら わかるのですが、空白だったら転記するみたいな適当なサンプルにこれ以上 何を回答すればいいのか・・・という。。。 はじめに戻る意味は?上書きの意味は?
neko_coffee

2020/08/06 05:09

質問にも追記したのですが、伝わりますでしょうか… C2,C3,C4に入力→登録→別シートA2,B2,C2へ転記→ C2,C3,C4に入力→登録→別シートA3,B3,C3列へ転記→ C2,C3,C4に入力→登録→別シートA4,B4,C4列へ転記→ ・・・ C2,C3,C4に入力→登録→別シートA101,B101,C101列へ転記→ C2,C3,C4に入力→登録→別シートA2,B2,C2列へ転記→
DreamTheater

2020/08/06 05:39 編集

同じデータをループで何度も転記する意味がさっぱりわかりません。 元データのC2~4は都度内容が異なり、それを前回Saveした次の位置に転記したいのでは? それで100行分使い切ったら元に戻って先頭から上書きするのなら、現在のSave位置を保持しておいて、100未満なら+1の行に転記、100ならSave位置をリセットすれば良いです。 条件の書き方が曖昧過ぎです。
yureighost

2020/08/06 05:21

ゲームのセーブ情報ですか。 思い付いたこととしては最後に上書きした行数を別途どこかのセルに保存しておいて、 転記毎にその行数を1増やし、101を超えたら1に戻すとかでいいのではないでしょうか。
mdj

2020/08/06 05:47 編集

For i = 2 To 101の「101」はコピー元の最大行値で、("A" & i)が("A" & Fix(i/100)*100+i)で、("C2")が("C" & i)で、どうでしょう。 追記:("C3")が("C" & i+1)、("C4")が("C" & i+2)。これらが固定ならばですけど 追記2:完全に読み違えてました。すいません。コピー元が100越えたら1に戻すものだと。
neko_coffee

2020/08/06 05:24

元データのC2~4は都度内容が異なり、それを前回Saveした次の位置に転記したい 100行分使い切ったら元に戻って先頭から上書き まさにその通りです;;
DreamTheater

2020/08/06 05:29

それならForループが無用の長物であることは自明ですよね?
neko_coffee

2020/08/06 07:36

質問がわかりにくいなか皆さまアドバイスやヒントをありがとうございます。 全くの初学者ゆえ見様見真似で作成している状況です。色々調べてみてはいるのですが、調べ方も悪いのかもしれません… 最後に上書きした行数を別途セルに保存&転記毎に行数を1増やし101を超えたら1に戻す、という考え方はわかるのですが、どう記述したらよいかわからず…
guest

回答3

0

ExcelVBA

1Option Explicit 2 3Sub 登録() 4 Dim rngFrom As Range 5 Dim rngTo As Range 6 Dim rngLog As Range 7 Dim ixRow As Long 8 Dim i As Long 9 10 'セル範囲の指定 11 Set rngFrom = Worksheets("シート").Range("C2:C4") 12 Set rngTo = Worksheets("表").Range("A2:C101") 13 Set rngLog = rngTo.Columns(4).Cells '作業列 14 ixRow = 1 15 16 '前回登録時の目印を探す 17 With WorksheetFunction 18 i = .Max(rngLog) 19 On Error Resume Next 20 ixRow = .Match(i, rngLog, 0) + 1 21 On Error GoTo 0 22 End With 23 '行が100行を超えたら、初期値1に戻す 24 If ixRow > 100 Then ixRow = 1 25 26 rngFrom.Copy 27 rngTo(ixRow, 1).PasteSpecial Transpose:=True 28 rngLog(ixRow, 1).Value = i + 1 '登録回数を記録(次回の登録時の目印に使う) 29End Sub 30

登録毎に回数をカウントして記録してはいかがでしょうか?
そうすると、最大値を探すと前回登録された位置が
Match関数で探せます。
エクセルでは、作業用の列や作業用のシートを使用すると
考え方が簡単になることが多いです。
あと、セル範囲を変数に代入することを覚えると、
書き方が簡単になります。(セルを基準のセルからの相対位置で示します。)

フォームコントロールのボタンに登録してみてくだざい。

投稿2020/08/06 10:45

mattuwan

総合スコア2136

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

DreamTheaterさんのソースを流用させてもらって、
初めから行数をセルに保持しておくところだけ変えたやり方です。
保持セルを仮でA1にしてありますが、必要によって変えて下さい。

VBA

1Sub addSaveData 2 Dim counter As Long 3 Dim saveCell As Range: Set saveCell = Range("A1") 4 5 counter = saveCell 6 7 If counter >= 99 Then 8 counter = 0 9 End If 10 11 Sheets("表").Range("A2").Offset(counter, 0).Value = Sheets("入力").Range("C2").Value 12 Sheets("表").Range("A2").Offset(counter, 1).Value = Sheets("入力").Range("C3").Value 13 Sheets("表").Range("A2").Offset(counter, 2).Value = Sheets("入力").Range("C4").Value 14 counter = counter + 1 15 16 saveCell = counter 17End Sub

投稿2020/08/06 07:56

yureighost

総合スコア2183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mattuwan

2020/08/06 09:58

値を保持する必要はなく、シートの状態を見ればよいことなので、マイナス評価にしました。
guest

0

###補足(追記)
このVBAが書かれたブックを一旦閉じて、再度開いたときもセーブ位置を保持したいのなら、
ブックを閉じるときに現在のセーブ位置を任意のシートのセルに代入しておいて、次回開くときに
そのセルから値を戻す必要があります。

###サンプルコード

VBA

1Private nowSavePoint As Integer '現在のセーブ位置 2 3' 以下はセーブ位置をリセットするときに呼び出す 4Sub initializeSavePoint 5 nowSavePoint = 0 6End Sub 7 8' 新たにセーブするときに呼び出す 9Sub addSaveData 10 If nowSavePoint >= 99 Then 11 Call initializeSavePoint 12 End If 13 Sheets("表").Range("A2").Offset(nowSavePoint, 0).Value = Sheets("入力").Range("C2").Value 14 Sheets("表").Range("A2").Offset(nowSavePoint, 1).Value = Sheets("入力").Range("C3").Value 15 Sheets("表").Range("A2").Offset(nowSavePoint, 2).Value = Sheets("入力").Range("C4").Value 16 nowSavePoint = nowSavePoint + 1 17End Sub

以上!

投稿2020/08/06 05:36

編集2020/08/06 06:48
DreamTheater

総合スコア1095

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

radames1000

2020/08/06 06:47

「Call nowSavePoint」は「Call initializeSavePoint」でしょうか。
DreamTheater

2020/08/06 06:49

ご指摘ありがとうございます。 訂正しましたm(_ _)m
neko_coffee

2020/08/06 07:26

回答ありがとうございます。 重ねてすみません、登録ボタンを押すと反映されるようにしたく、Sub 登録() ~ End Sub 内に組み込みたいと思っています。しかし、ご教示頂いた回答を記述したところ、If nowSavePoint >= 99 Thenの箇所のnowSavePointが未定義エラーになってしまいました。ステートメントの理解が浅く申し訳ないのですが、教えていただければ幸いです。
DreamTheater

2020/08/06 07:39

サブルーチンと同じモジュールに1行目(Private nowSavePoint As Integer)を記述してますか?
neko_coffee

2020/08/06 07:59

サブルーチンとSub addSaveDataのことでしょうか…?頂いた回答そのままの順番で記述してみたのですが、1行目に関しては他の箇所に記述するものなのでしょうか?
mattuwan

2020/08/06 10:00 編集

う~ん。 質問者の意図をくみ取れてないということでマイナス評価にしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問