プロが教える店舗&オフィスのセキュリティ対策術

エクセルの表のF9~F16に、上から順に、  H、空白、H3、空白、空白、H、空白、空白
と記載されています。
このHが二つあるのを解消したいのですが、下の方をH2に直して解消したいのです。

この修正する方法をできれば、マクロで修正したいのですが、その方法を教えてください。
よろしくお願いします。

実はこのH、H2,H3の表現は、別の列にある数値の1番小さいものをH、2番目をH2、3番目をH3と
マクロを使って計算しており、このH,H2,H3の表現から別の表のある記号を同じマクロを使って抽出しているのですが、Hが2つあると、マクロが止まってしまい、その都度手で治す必要が出てきます。(Hが2つある場合、H2が計算上なくなるので、ここでマクロが止まってしまいます)
数量が非常に多いので、これをスムーズに行かさないと、死ぬまでに終わりません。
よろしくお願いします。

A 回答 (5件)

No4です。

補足ありがとうございました。
とりあえず、HをH2に変換するマクロです。
F9~F16の範囲で、2つ目以降のHをH2に変換します。
(3つ目以降のHもH2に変換します)

Public Sub HをH2に変換()
Dim ws As Worksheet
Set ws = ActiveSheet
Dim wrow As Long
Dim count As Long: count = 0
For wrow = 9 To 16
If ws.Cells(wrow, "F").Value = "H" Then
count = count + 1
If count > 1 Then
ws.Cells(wrow, "F").Value = "H2"
End If
End If
Next
End Sub
    • good
    • 0
この回答へのお礼

ありがとうございます。
出来ました。

イヨ! 大統領!
すごいです。
こんなにうれしいのは久しぶりです。

今後ともよろしくお願いします。

お礼日時:2023/04/12 16:18

補足要求です。


1.最初のHの出現する可能性のあるセルは、F9~F16で、あってますか。
2.2番目のHの出現する可能性のあるセルは、どの範囲になりますか。
3.3番目のHが出現するケースはないと考えて良いですか。
4.重複するのはHだけで、H2が重複とかH3が重複とかのケースはないと考えて良いですか。
    • good
    • 0
この回答へのお礼

ありがとうございます。

お答えします。
1⇒その通りです。

2⇒F9~F16です。(D列での2番目に小さい数字に対応しているのでF9もありです)

3⇒出現するケースはありますが、非常にまれなため、マクロが止まっても対応可能です。よってそのケースは無視してもらってもOKです。

4⇒H2の重複はあります。この場合は行の下のH2をH3に直します。

ただ、Hが2個の場合がわかればH2が2個の場合もなんとかできると考え、質問はHのみに致しました。
尚H3の重複はありますが、D列の3番目に小さい数字を上の列から認識していくので、一番上に現れたH3に次のステップでは反応するため、F列上にいくらH3が現れても構いません。マクロは次に進みます。

H2はD列(D9~D16)で計算した数値が小さい方から2番目なので、
H2もHと同じく、F上ではF9~F16となります。H3も同様です。

尚D列の最小値が2個の場合、F列ではHが2個となり、3番目に小さい数字が
H3となり、H2がF列に現れません。よって本来F列のH2により、出そうとしている、別の記号が”#N/A”となり、マクロが止まってしまいます。
マクロは6万個ほど実施しなくてはならないためとても止まってなどいられません。よろしくお願いいたします。
(注)Hが2個の場合(もしくはH2が二個の場合は、エクセル表の行の上のほうをH、下のほうをH2と定義しています。(H2二個のばあいは上をH2,下をH3)

お礼日時:2023/04/12 15:23

最初のHがどこに来るか分からないため、すべてのセルに対して処理を書く必要があるということですね。

その場合は、F9~F16の範囲だけでなく、全てのセルに対して処理を行う必要があるため、以下のようなコードになります。

Sub ReplaceH()
For Each cell In ActiveSheet.UsedRange
If cell.Value = "H" Then
If cell.Offset(1, 0).Value = "H" Then
cell.Offset(1, 0).Value = "H2"
End If
End If
Next cell
End Sub

ActiveSheet.UsedRangeは、現在アクティブなシートで使用されている範囲を示します。このコードは、全てのセルに対してHが2つある場合に下のセルをH2に置き換えるものです。
    • good
    • 0
この回答へのお礼

ありがとうございます。
上記式でやってみましたが、If cell.Value = "H" Then の所で、型が一致しないと出ます。
シートの表は、A1~KY400ぐらいまであるので、やはりF9~F16に絞らないと、ダメかと思います。
F9~F15までにあるHに対し、その下にHがあればそのHをH2にするだけなので、簡単な方法があると思うのですが、いくら考えても私の脳では無理なのでよろしくお願いします。
今年75歳の年寄りで、余命25年ほどしかありません。データーが6万ほどあるので、一回一回マクロが止まれば、死ぬまでに完結しません。
なにとぞよろしくお願い申し上げます。

お礼日時:2023/04/12 15:44

こんにちは



>実はこのH、H2,H3の表現は、~~
>マクロを使って計算しており
よくわかりませんけれど、そちらの出力ロジックを修正すべきでは?
継当てをして、更に継当てをするような発想になりかねないので、しまいには何が何だかになりそう。
    • good
    • 1
この回答へのお礼

ありがとうございました。実はマクロを使っての計算は、ややこしいので、マクロ上で一度、値に変更した場合で検討していました。値でセットされている場合でのいい方法はないでしょうか

尚、マクロは、F9~F26のセルに
IF(D9=SMALL($D$9:$D$26,1),"H",IF(D9=SMALL($D$9:$D$26,2),"H2",IF(D9=SMALL($D$9:$D$26,3),"H3","")))
という関数を、入れたうえで、動かしていたのですが、お答えの内容ではこの式でH、H2,H3を特定することが良いのではといわれていると思います。
この式のどこかを直せばよいでしょうか?もしくはこれ以外の式があるのでしょうか?教えてください

お礼日時:2023/04/12 14:12

マクロを使って、F9~F16のセルの値を読み取り、Hが2つある場合にはH2に書き換える方法があります。


以下のようなVBAコードを作成することができます。

Sub ReplaceH()
For Each cell In Range("F9:F16")
If cell.Value = "H" Then
If cell.Offset(1, 0).Value = "H" Then
cell.Offset(1, 0).Value = "H2"
End If
End If
Next cell
End Sub

これは、F9~F16のセルを順番に読み取り、もしセルの値が"H"で、その下のセルの値も"H"だった場合には、下のセルを"H2"に書き換えるものです。
実行すると、F9~F16のセルのHが2つある場合には、H2に置き換えられます。
    • good
    • 0
この回答へのお礼

ありがとうございました。
上記内容をエクセルに入れると、”H”の入った行の一つ下では、OKなのですが、
2つ下以下の場合にはどうすればよいでしょうか?
for n=1 to 18
を使って、(1,0)を(n,0)にやってもうまくいかないので、もしうまくいく方法があれば教えてください。
ただ、2つ下に特定して(2,0)とすれば2つ下だけはできます。
でも最初の”H”がどこに来るかもしれないので、すべての式を書くのは大変でとてもできそうにありません。よろしくお願いいたします。

お礼日時:2023/04/12 14:02

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