Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10全般 : Microsoft 365)
検索にヒットした全てのセルに数式貼り付け
投稿日時: 23/06/28 06:56:40
投稿者: wa-nn

お世話になります。
表題の件について、下記内容にて処理を行いたいです。
教えて頂けると幸いです。
宜しくお願い致しますm(_ _)m
 
・A1~C1をコピー
・F20~F500にて、SUMを使っているセルを検索
・該当する全てのセルに数式貼り付け
 
 
 
 

回答
投稿日時: 23/06/28 08:42:47
投稿者: WinArrow

>F20~F500にて、SUMを使っているセルを検索
は、検索文字列に「=SUM」を指定して検索すれば、対象セルを取得することができます。
 これをマクロの記録でコードを作成することができます。
但し、ループ処理になるため、コードの修正が必要になります。
 
 
ところで
>A1~C1をコピー
は、数式の複写元と思われます。
複写元は3列、複写先は1列・・・・
複写元と複写先が矛盾していると思われます。

回答
投稿日時: 23/06/28 08:59:20
投稿者: Suzu

ご自身で検討し、どのように考え、何が判らないでつまづいているのでしょうか?
 
 
全く思いつかないのであれば、
VBAではなく、一般機能で 対応した方が良いと思いますよ。
 
 
A1〜C1 の数式 が 行方向の参照範囲が変動しない数式である前提で
 
1. 20行目以降の適当な列に 現状の並び順を記憶しておく列を作り、1〜 の連番を振る
2. 20行目以降の適当な列に 『=FIND("=SUM(",FORMULATEXT(F20),1)』を指定
  =SUM( で始まる行では、「1」が表示され、異なる場合には #N/A となる
3. 2で指定した列 で並び替え 1の値だけが集まるので、
  A1〜C1 の数式をコピーし、2 の値が、1の行について、数式貼り付け
4. 1 のフィールドで並べ替えを行い、元の順番に戻す
5. 必要に応じて、 1 と 2 の列を削除

投稿日時: 23/06/28 09:05:20
投稿者: wa-nn

WinArrow さんの引用:
>F20~F500にて、SUMを使っているセルを検索
は、検索文字列に「=SUM」を指定して検索すれば、対象セルを取得することができます。
 これをマクロの記録でコードを作成することができます。
但し、ループ処理になるため、コードの修正が必要になります。
 
 
ところで
>A1~C1をコピー
は、数式の複写元と思われます。
複写元は3列、複写先は1列・・・・
複写元と複写先が矛盾していると思われます。

 
御返信ありがとうございます。
全てを選択する為のループ処理がわからない為、教えて頂けると幸いです。
 
貼り付けは
該当したセル(F列)の隣の2行も行う為、
複写先と複写元の列の数が一致しない状態です。
 
宜しくお願い致しますm(_ _)m

回答
投稿日時: 23/06/28 09:51:52
投稿者: WinArrow

引用:
該当したセル(F列)の隣の2行も行う

>隣の2行
は、2列ですよね?
 
F20:F500の検索時には、A1:C1の数式は関係ないので、
「検索」と「数式複写」は切り離し手考えましょう。
 
参考コード
 
Sub sample1()
Dim c As Range
Dim firstAddress As String
    With Worksheets(1).Range("F20:F500")
        Set c = .Find(what:="SUM(", LookIn:=xlFormulas, lookat:=xlPart)
        If Not c Is Nothing Then
            firstAddress = c.Address
            Do
    'この部分に数式を複写するコードを記述する。
    '「3つのセルを一緒に」ではなく、セル個々に考えましょう
    '数式を複写する場合は、絶対参照/相対参照をよく考えてください。 
                Set c = .FindNext(c)
            Loop While Not c Is Nothing And c.Address <> firstAddress
        Else
            MsgBox "検索条件に合致するセルは存在しないよ"
        End If
    End With
                                
End Sub

回答
投稿日時: 23/06/28 10:11:50
投稿者: WinArrow

検索指定の解説
 
>Set c = .Find(what:="SUM(", LookIn:=xlFormulas, lookat:=xlPart)
 
what:="SUM(" 検索する文字列を指定します。
    先頭に「=」を付けると、「=」で始まっている数式が対象となります。
    「SUM」だけだと「SUM」という文字列の名前も対象になるため「(」を付けています。
     この指定で質問者の意図と合致しているかは判断できません。
LookIn:=xlFormulas  検索対象が「数式」である指定です。
lookat:=xlPart   部分一致(曖昧検索)を指定しています。
 
上の指定は、必要に応じて変更してください。

回答
投稿日時: 23/06/28 17:55:10
投稿者: WinArrow

前レスのコードの中のコメントを訂正します。
 
> '「3つのセルを一緒に」ではなく、セル個々に考えましょう

   '「3つのセルを一緒に」でも貼付けはできます。

回答
投稿日時: 23/06/29 19:54:02
投稿者: simple

SUM関数を使っている部分を探すところは、既に回答がありました。
残る課題は、数式貼り付けのところですか?
どのあたりに詰まっていますか?
 
>セルに数式貼り付け
と書かれているので、それで結果が得られるという前提に立つと、
・A1〜C1をコピーして
・仮に、F20〜H20に、「形式を選択して貼り付け」ー「数式」 を実行するケースについて
その動作をマクロ記録してみれば、コードの骨格がわかるはずです。
(F20〜H20を選択しなくても、F20を選択するだけでよいはずです。)
 
# 値貼り付けとかの色々な"コピーペイスト"処理は、基本的なものなので、
# どのテキストでも取り上げられていると思います。
# ("1丁目1番地"は政治家麻生さんの好きな言い方だったかなw)
# 実際に手を動かしてトライすれば、より理解が進むものと思います。

投稿日時: 23/06/30 06:42:22
投稿者: wa-nn

Suzu さんの引用:
ご自身で検討し、どのように考え、何が判らないでつまづいているのでしょうか?
 
 
全く思いつかないのであれば、
VBAではなく、一般機能で 対応した方が良いと思いますよ。
 
 
A1〜C1 の数式 が 行方向の参照範囲が変動しない数式である前提で
 
1. 20行目以降の適当な列に 現状の並び順を記憶しておく列を作り、1〜 の連番を振る
2. 20行目以降の適当な列に 『=FIND("=SUM(",FORMULATEXT(F20),1)』を指定
  =SUM( で始まる行では、「1」が表示され、異なる場合には #N/A となる
3. 2で指定した列 で並び替え 1の値だけが集まるので、
  A1〜C1 の数式をコピーし、2 の値が、1の行について、数式貼り付け
4. 1 のフィールドで並べ替えを行い、元の順番に戻す
5. 必要に応じて、 1 と 2 の列を削除

 
大変申し訳ありません。
以後、コードも記載いたします。
申し訳ありませんでした。

投稿日時: 23/06/30 06:48:18
投稿者: wa-nn

WinArrow さんの引用:
引用:
該当したセル(F列)の隣の2行も行う

>隣の2行
は、2列ですよね?
 
F20:F500の検索時には、A1:C1の数式は関係ないので、
「検索」と「数式複写」は切り離し手考えましょう。
 
参考コード
 
Sub sample1()
Dim c As Range
Dim firstAddress As String
    With Worksheets(1).Range("F20:F500")
        Set c = .Find(what:="SUM(", LookIn:=xlFormulas, lookat:=xlPart)
        If Not c Is Nothing Then
            firstAddress = c.Address
            Do
    'この部分に数式を複写するコードを記述する。
    '「3つのセルを一緒に」ではなく、セル個々に考えましょう
    '数式を複写する場合は、絶対参照/相対参照をよく考えてください。 
                Set c = .FindNext(c)
            Loop While Not c Is Nothing And c.Address <> firstAddress
        Else
            MsgBox "検索条件に合致するセルは存在しないよ"
        End If
    End With
                                
End Sub

 
詳細ありがとうございます。
firstAddress = c.Address
Addressが必要なのですね!!!
貼り付け作業は個々で致しますm(_ _)m

投稿日時: 23/06/30 06:52:40
投稿者: wa-nn

WinArrow さんの引用:
検索指定の解説
 
>Set c = .Find(what:="SUM(", LookIn:=xlFormulas, lookat:=xlPart)
 
what:="SUM(" 検索する文字列を指定します。
    先頭に「=」を付けると、「=」で始まっている数式が対象となります。
    「SUM」だけだと「SUM」という文字列の名前も対象になるため「(」を付けています。
     この指定で質問者の意図と合致しているかは判断できません。
LookIn:=xlFormulas  検索対象が「数式」である指定です。
lookat:=xlPart   部分一致(曖昧検索)を指定しています。
 
上の指定は、必要に応じて変更してください。

 
 
検索する文字列を指定する際もSUMだけでも
3つ(SUM/=SUM/SUM( )それぞれ使い分け考えないといけないのですけ。
とてもわかりやすくて参考になりますm(_ _)m

投稿日時: 23/06/30 06:57:43
投稿者: wa-nn

simple さんの引用:
SUM関数を使っている部分を探すところは、既に回答がありました。
残る課題は、数式貼り付けのところですか?
どのあたりに詰まっていますか?
 
>セルに数式貼り付け
と書かれているので、それで結果が得られるという前提に立つと、
・A1〜C1をコピーして
・仮に、F20〜H20に、「形式を選択して貼り付け」ー「数式」 を実行するケースについて
その動作をマクロ記録してみれば、コードの骨格がわかるはずです。
(F20〜H20を選択しなくても、F20を選択するだけでよいはずです。)
 
# 値貼り付けとかの色々な"コピーペイスト"処理は、基本的なものなので、
# どのテキストでも取り上げられていると思います。
# ("1丁目1番地"は政治家麻生さんの好きな言い方だったかなw)
# 実際に手を動かしてトライすれば、より理解が進むものと思います。

 
 
御連絡が遅くなり申し訳ありません💦
解決しました!!!
今は初歩的なエラーで止まってしまったり
思ったように進まなかったりして苦戦してしまいますが.....
いろいろトライしてみます♫
 
今後とも宜しくお願い致しますm(_ _)m

投稿日時: 23/06/30 07:01:53
投稿者: wa-nn

WinArrow さんの引用:
前レスのコードの中のコメントを訂正します。
 
> '「3つのセルを一緒に」ではなく、セル個々に考えましょう

   '「3つのセルを一緒に」でも貼付けはできます。

 
上手く実行できました!!!
丁寧に教えて頂き、本当にありがとうございました(TT)
今後とも宜しくお願い致しますm(_ _)m