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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

VBA

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

解決済

4回答

1013閲覧

表内の空白セルを左セルの値コピーで埋めたい

dela

総合スコア9

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

VBA

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

0クリップ

投稿2020/05/14 06:19

上の表を下の表のようにしたいです

||A|B|C|D|E|F|G|
|:--|:--:|--:|
|1|||||100||||
|2|30|||20|||80
|3||10||40||60|

||A|B|C|D|E|F|G|
|:--|:--:|--:|
|1|0|0|0|0|100|100|100|
|2|30|30|30|20|20|20|80
|3|0|10|10|40|40|60|60

#条件
0. 所与の値は生かす

  1. a1から所与の値があるセルe1一つ前までを選択 (a1:d1)
  2. a1の値をコピー
  3. e1は生かす
  4. f1,最終列g1までe1をコピー
  5. 次の行へ

列は800程度、行は1600程度の数があるため、手動のオートフィルではなく、自動化できたらと思うのですが、所与の値を生かす論理式が思いつきません

ExcelでもGoogleスプレッドシート でもマクロでも何かしらでできたらと思います

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

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

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

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

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

meg_

2020/05/14 07:13

・条件が抜けているかと思いますが、「コピー元が空白の時は'0'とする」ということですか? ・マクロはどのくらい出来ますか?
dela

2020/05/14 08:50

はい、コピー元が空白の時は0とします マクロは、あんまりできないです。サンプルコードを参考に修正したりとか程度です。
guest

回答4

0

G2:SEF1600
という範囲です。大きすぎるのでしょうか。

ということは「約12,980」列ですね。
最初は「列は800程度、行は1600程度」と言ってませんでしたっけ?(汗;

こちらで、2000行分のデータを作ってやってみましたが、
とりあえず処理は完了しました。5分くらいかかりましたが・・・

イメージ説明

デバッグすると
cur = rng.Value
でとまります

なるほど、そうでしたか。
それでは、プロシージャの冒頭部分のDim文の「Integer」をすべて「Long」に置き換えてみてください。
もしかしたら、たんに「rng.Value」の値が「Integer」を超えていただけかもしれません。
私の方はサンプルの値をタイル状にコピーしていたので気が付きませんでした。

なお、処理が長時間かかる場合には、

VBA

1 For ro = yStart To yEnd 2 Debug.Print ro ` 現在処理中の行番号 3 For co = xStart To xEnd

のようにしておけば、現在処理中の行番号を出力してくれます。

投稿2020/05/16 00:56

autumn_nsn

総合スコア335

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

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

dela

2020/05/19 04:04

こちらの後出しにもかかわらずありがとうございました!大変勉強になりました。
guest

0

ベストアンサー

ExcelVBA

1Sub test() 2 Dim a As Range 3 4 With ActiveSheet.UsedRange 5 .Columns(1).SpecialCells(xlCellTypeBlanks).Value = 0 6 .SpecialCells(xlCellTypeBlanks).FormulaR1C1 = "=RC[-1]" 7 .Value = .Value 8 End With 9End Sub

こんな感じですかね。
量が多くて処理できないなら、
セル範囲を狭めて何回か繰り返してください。

投稿2020/05/16 08:10

mattuwan

総合スコア2163

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

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

0

大変失礼しました。
オーバーフローですか、、、Range()で取得する範囲が大きすぎるのでしょうか?

ちょっと直してみました。
セルの取得には「Sheet1.Cells(ro, co)」を使っています。
これでどうでしょうか?

VBA

1Sub fill_test2() 2 Dim rng As Range 3 Dim cur As Integer 4 Dim ro As Integer, co As Integer 5 Dim xStart As Integer, xEnd As Integer 6 Dim yStart As Integer, yEnd As Integer 7 Dim init_val As Boolean 8 9 ' 指定された範囲の座標を取得する 10 With Sheet1.Range("A1:G4") 11 xStart = .Column 12 xEnd = xStart + .Columns.Count - 1 13 yStart = .Row 14 yEnd = yStart + .Rows.Count - 1 15 End With 16 17 For ro = yStart To yEnd 18 For co = xStart To xEnd 19 ' 行が変わったらフラグをクリアする 20 If co = xStart Then init_val = False 21 22 Set rng = Sheet1.Cells(ro, co) 23 24 If rng.Value = "" Then 25 If init_val Then 26 rng.Value = cur 27 Else 28 rng.Value = 0 29 End If 30 Else 31 cur = rng.Value 32 If init_val = False Then init_val = True 33 End If 34 Next co 35 Next ro 36End Sub

もし、これでもオーバーフローする場合には、
最初のWith文はカットして、
xStart, xEnd, yStart, yEndを手動でセットしてみてください。
それで動くかどうか・・・

投稿2020/05/15 05:23

autumn_nsn

総合スコア335

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

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

dela

2020/05/15 08:28

ありがとうございます これでもオーバフローしてしまいました デバッグすると cur = rng.Value でとまります G2:SEF1600 という範囲です。大きすぎるのでしょうか。。
guest

0

以下のようなコードで実現できると思います。

VBA

1Sub fill_test() 2 Dim rng As Range 3 Dim cur As Integer 4 Dim prev As Integer: prev = -1 5 Dim init_cur As Boolean 6 7 For Each rng In Sheet1.Range("A1:G4") 8 If rng.Column < prev Then init_cur = False 9 prev = rng.Column 10 11 If rng.Value = "" Then 12 If init_cur Then 13 rng.Value = cur 14 Else 15 rng.Value = 0 16 End If 17 Else 18 cur = rng.Value 19 If init_cur = False Then init_cur = True 20 End If 21 Next rng 22End Sub 23

イメージ説明

↓ 上記のコードで以下のようになります。

イメージ説明

投稿2020/05/14 07:14

autumn_nsn

総合スコア335

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

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

dela

2020/05/14 08:38

ありがとうございます こちらのコードで試してみたところ、狭い範囲でなら動くのですが、 表全体 1600行×800列だと、「実行時エター'6' オーバーフローしました」という警告が出てしまいます。たまに1行目はうまくいっているのですが、2行目以降の処理ができないようです。 繰り返し回数が大きすぎるのは別の作法が必要になるでしょうか。
autumn_nsn

2020/05/15 05:24

失礼しました。 コードを手直ししてみましたので、そちらを試してみてください。 この欄ではソースを記述できないので、別の回答として書き込んでいます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問