[[20211121050723]] 『表示シートの特定の行のみ値に直したい』(のり) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『表示シートの特定の行のみ値に直したい』(のり)

既存のマクロを使って指示を書きましたが
実現できなく、どこが間違いかわからないため
ご助力いただけませんでしょうか。

【行いたいこと】
L列に「入庫」と入っている複数の行のM列からAP列のみ関数を値に変換したいです。

「工場」シートのE2にはその月の日数が入っています
(11月なら「30」=DAY(EOMONTH(B2,0)))

M列からAP列はカレンダーになっていて入庫の行には
その入庫数が関数の数式で数字が入力されております。
(11月ならM列が11/1の入庫数 AP列は11/30の入庫数といった具合です)

Sub 入庫欄を値に()
'
'現在の表示シートのみ、入庫欄を値にする
'
Application.ScreenUpdating = False

aaa = Sheets("工場").Range("E2") - 1
For i = 5 To lastrow
lastrow = Cells(1000, 12).End(xlUp).Row

 If Cells(i, 12) = "入庫" Then
  Range(Cells(i, 13), Cells(i, 13 + aaa)) = Range(Cells(i, 13), Cells(i, 13 + aaa)).Value
End If

Next

Application.ScreenUpdating = True
MsgBox "「入庫」欄の値貼り付けが完了しました。"
End Sub

< 使用 Excel:Office365、使用 OS:Windows10 >


追記です。入庫の行は5行目以降から発生しております。
(のり) 2021/11/21(日) 05:26

 lastrow = Cells(1000, 12).End(xlUp).Row
は
For i = 5 To lastrow
より前にしないとlastrowは0です
13 + aaaは
aaa = Sheets("工場").Range("E2") + 12
としておけばaaaでよいのでは
(どん) 2021/11/21(日) 06:00

 どんさんのアドバイスを踏まえて、こんな感じでしょうか。

 Sub 入庫欄を値に改()
    Dim i As Long, aaa As Long
    Application.ScreenUpdating = False
    aaa = Sheets("工場").Cells(2, 5).Value
    For i = 5 To Cells(1000, 12).End(xlUp).Row
        If Cells(i, 12).Value = "入庫" Then
            With Cells(i, 13).Resize(, aaa)
                .Value = .Value
            End With
        End If
    Next
    Application.ScreenUpdating = True
    MsgBox "「入庫」欄の値貼り付けが完了しました。"
 End Sub

 ※EOMONTHは別シートでした。該当部修正しました。07:07
(まるごとバナナ) 2021/11/21(日) 06:48

どんさん、まるごとバナナさんありがとうございます。
問題なく実現できました。
(のり) 2021/11/22(月) 14:35

すいません、上記の流れで値に変換した行の中に含まれる数字の「0」を消すマクロを作りたいのですが、下記で実施すると0以外の全部の数字消えてしまいます。
どこがおかしいかご教示いただけないでしょうか。

Sub ゼロを消す()

    Dim i As Long, aaa As Long
    Application.ScreenUpdating = False
    aaa = Sheets("工場").Cells(2, 5).Value
    For i = 5 To Cells(1000, 12).End(xlUp).Row
        If Cells(i, 12).Value = "入庫" And Value = 0 Then
            With Cells(i, 13).Resize(, aaa)
                .Value = ""
            End With
        End If
    Next
    Application.ScreenUpdating = True
    MsgBox "完了"
 End Sub
(のり) 2021/11/22(月) 15:08

”入庫” AND Value=0
セルを指定してみたらどうでしょうか
(ひまじん) 2021/11/22(月) 16:18

 なんでもマクロでやらなくても、エクセルにはいろいろな機能が搭載されています。

 例1)Excelのオプションの詳細設定から「次のシートで作業するときの表示設定」グループにある、
      「ゼロ値のセルにゼロを表示する」のチェックを外してみる。
 例2)該当範囲(提示例なら1日から月末までの範囲)のセルの書式設定をユーザー定義で「#,###」としてみる。
 例3)値貼付する前の数式の段階でゼロを表示しないようにしておく。IF(計算式=0,"",計算式)等

 そうではなくて、「10500」を「15」にしたいとかでしょうか?
(まるごとバナナ) 2021/11/22(月) 19:18

 >Value = 0

 Value が変数宣言してない型の決まってない(variant型)ただの変数。
 variant型の初期値空白にもなるし、0にもなるから成立。

 MsgBox Value = ""
 MsgBox Value = 0

 ってやればわかる。
 見よう見まねで無く、With について少しは勉強してください。
(にくちゃんねる) 2021/11/22(月) 19:53

ご回答ありがとうございました。

ひまじんさん、にくちゃんねるさん もう少し勉強して出直してこようと思います。
まるごとバナナさん 例2で解決できそうです。
(のり) 2021/11/23(火) 05:00


 解決できそうで何よりです。
 VBAに囚われず、Excelの機能を活用する事であっさり解決する場合もあります。
 ご利用のバージョンがOffice365ということですので、是非ご活用下さい。(羨ましい。。。)

 ネット上にはVBAの解説サイトがたくさんありますので
 基本的な知識だけでも習得しておくと、コードを改変する場合も捗ると思います。
 第一歩として「変数の宣言を強制する」をWeb検索してみてください。
 以下、よろしければご参考に。

 Sub 入庫欄を値にした後ゼロ値消去()
    Dim i As Long, aaa As Long
    Application.ScreenUpdating = False
    aaa = Sheets("工場").Cells(2, 5).Value
    For i = 5 To Cells(1000, 12).End(xlUp).Row
        If Cells(i, 12).Value = "入庫" Then
            With Cells(i, 13).Resize(, aaa)
                .Value = .Value
                .Replace What:=0, Replacement:="", LookAt:=xlWhole
            End With
        End If
    Next
    Application.ScreenUpdating = True
    MsgBox "「入庫」欄の値貼り付けが完了しました。"
 End Sub
(まるごとバナナ) 2021/11/23(火) 06:23

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.