アプリ版:「スタンプのみでお礼する」機能のリリースについて

こんにちは、以下のコードはC6セルにある文字を同じかどうか判断して、C6、G6、H6の条件が合致したらSheet2に転記するコードです。

それで、3点教えて頂きたいのですが

■1点目 条件が合致した場合、このコードでは書式なども転記されるので、値のみ転記したい
■2点目 このコードではこのコードを実行した時に以下であるかを判定し転記すると思います
そうではなくて、常時実行しておいて条件が揃えば実行するに変更
■3点目 C6に何も入ってなければ無視するというコードを追加

以上3点 詳しい方、よろしくお願いします。

**********************
Sub 転記()

Dim wsA As Worksheet
Dim wsB As Worksheet
Dim lastRow As Long

Set wsA = ThisWorkbook.Sheets("Sheet1")
Set wsB = ThisWorkbook.Sheets("Sheet2")

If wsA.Range("C6").Value = "価格" And (wsA.Range("F6").Value >= wsA.Range("G6").Value Or wsA.Range("F6").Value <= wsA.Range("H6").Value) Then
lastRow = wsB.Cells(wsB.Rows.Count, "B").End(xlUp).Row + 1 ' find next available row in column B of SheetB
wsA.Range("B6:M6").Copy Destination:=wsB.Range("B" & lastRow) ' copy values from SheetA B6:M6 to SheetB last available row
wsA.Range("B6:I6,L6:M6").ClearContents ' clear values from B6:I6 and L6:M6 on SheetA

ElseIf wsA.Range("C6").Value = "状態" And (wsA.Range("F6").Value <= wsA.Range("G6").Value Or wsA.Range("F6").Value >= wsA.Range("H6").Value) Then
lastRow = wsB.Cells(wsB.Rows.Count, "B").End(xlUp).Row + 1 ' find next available row in column B of SheetB
wsA.Range("B6:M6").Copy Destination:=wsB.Range("B" & lastRow) ' copy values from SheetA B6:M6 to SheetB last available row
wsA.Range("B6:I6,L6:M6").ClearContents ' clear values from B6:I6 and L6:M6 on SheetA
End If

End Sub

A 回答 (1件)

こんにちは



■1点目
ご提示のコードで
 セル範囲A.Copy Destination:=セル範囲B
となっているところを
 セル範囲B.Value = セル範囲A.Value
のような形式にすれば、値のみコピーされます。
ただし、上記の記述の場合は、セル範囲Aとセル範囲Bのサイズ(行列の大きさ)を一致するようにしておく必要があります。
サイズを揃えるのには、resizeプロパティ等を利用なされば宜しいと思われます。
https://learn.microsoft.com/ja-jp/office/vba/api …

あるいは、PasteSpecial メソッドで「値のみ」を指定しても可能です。
https://learn.microsoft.com/ja-jp/office/vba/api …


■2点目
意味がちょっと良くわかりませんけれど、想像するところ「マクロをいちいち実行しなくても、関数のように自動で反映して欲しい」というご希望かと解釈しました。
不可能ではありませんけれど、多分、質問者様の意図とは異なる結果になりそうな気がします。
方法としては、シートのチェンジイベントを利用して転記するような方法になりますが、関数とは違ってご提示のマクロは「追記」してゆく処理になっているので、利用者の意図と異なって追記されかねません。

例えば、F6:H6が空白の状態(必ずしも空白でなくても条件が成立している状態)で、C6セルに「価格」なり「状態」が入力されると転記されます。
すると、入力したはずのC6セルがクリアされますので、おかしいと思って再入力するとまた転記されます。
といったことが起きかねないということです。
要は、人間が「まだ入力の途中」と思っていても、現状ではプログラム側にはそれを判断するすべが無いという意味です。
「必ずC6セルへの入力を最後に行う」とか、あるいは「入力が終了したことがわかる条件を明示することができる」のであれば「その時だけ処理を行う」ようにすることで、ご希望のようにできるかも知れません。


■3点目
現状のままで無視されると思いますが、コピーされてしまうのでしょうか?
    • good
    • 2
この回答へのお礼

回答頂き、ありがとうございます

3点目に関しては、準備的にお聞きしたので、あなたがおっしゃる通りでした。

1点目、2点目、理解出来ました、1点目は書き換えるだけなので良いとして、2点目を少し考えながらやってみたいと思います。

お礼日時:2023/02/22 11:07

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!