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

エクセル、マクロ初心者です。
商品番号と商品の詳細を管理するシートについてです。
下記の件でうまく動きません。
エラーをなくす方法をお教えていただけると助かります。

・商品番号は数字で下記の様な形です
 ex:
1-12345
31-11
1-23-2
1-23-5
8-123

①日付表示になってしまう商品番号があるので、該当列は文字列設定にしてあります。
並べ替えして、ハイフン毎に降順にしたい。
得たい結果:
1-23-2
1-23-5
1-12345
8-123
31-11

実際の結果:
1-12345
1-23-2
1-23-5
31-11
8-123
と最初の数字で並べられてしまう。

②商品番号を入れ、ボタンを押すと該当の商品行に移動するマクロを組んだが、
1-23と入力すると、みつかりませんでしたと表示されてほしいのに、枝番付きで一番番号が
若い1-23-2が、選択されてしまう。

Sub 検索()
Dim rng As Range
txt = Range("A2").Value
Set rng = Range("A3:A10000").Find(what:=txt)
If rng Is Nothing Then
MsgBox "みつかりませんでした。"
Else
rng.EntireRow.Select
End If
End Sub

質問者からの補足コメント

  • うーん・・・

    早急なご回答ありがとうございます(* ˆ ˆ *)
    それなのに、反応が遅くなり申し訳ありません。
    やはり想定されてる事以外をやろうとしてるんですね…

    1.シート名は製品台帳です。
    2.データの開始は5行目からです。
    3.CC列まであります

    No.2の回答に寄せられた補足コメントです。 補足日時:2023/07/03 09:31
  • うーん・・・

    早急なご回答ありがとうございます(* ˆ ˆ *)
    それなのに、反応が遅くなり申し訳ありません。

    ①は追加してみたのですが、やり方がおかしいのか、見つかりませんになりませんでした。

    ②は分割してそれぞれを並べると言うのは理解できたのですが、マクロが複雑で私には無理かもしれないです…
    データを分割して、エクセルのデータの並べ替え機能でやろうかと思います>_<

    ・階層は3つまで、
    ・ハイフンは必ず1つ(階層は2つ)はあります。
    ・2つ目のハイフンはない場合もあります。
    ・ハイフン以外は数字のみとなります

    No.1の回答に寄せられた補足コメントです。 補足日時:2023/07/03 09:44

A 回答 (3件)

補足ありがとうございます。


>1.シート名は製品台帳です。
>2.データの開始は5行目からです。
>3.CC列まであります

製品台帳のA列の最終行が10000行の場合、
A5:CC10000 の範囲がソートされますが、それで間違いないでしょうか。(A列の値がキー)
    • good
    • 0

①のソートに関してですが、VBAで提供されているsort関数は使用できません。

(ソートの方法が特殊なため)
よって、自前でこの機能を実装する必要があります。
以下、その前提での補足要求です。
1.シート名は何でしょうか。
2.データの開始は3行目からで間違いないでしょうか。
3.A列が、商品番号ですが、他の項目の列は何列までありますか。
(C列とかE列とかの返信を期待しています)
○列まである場合、ソート時は、A~○列の範囲がソートされます。
この回答への補足あり
    • good
    • 0

こんばんは



先に②の方を
ご提示の状態だと、含まれていればヒットしてしまうので、ご説明のような結果になるものと思います。
完全一致で検索すれば宜しいかと。
具体的には、Findメソッドで、LookAt:=xlWhole を追加指定しておけば良いと思われます。

①について
ハイフンで分割しておいて、数値としてそれぞれを並べ替えすれば良いですが、階層がどこまであるのか不明なので、一般化するとちょっと面倒ですね。
ハイフンが無かったり、数字以外の文字が混在している場合にどうするのかとか等他にもいろいろありそうですが。

またVBAには並べ替えのメソッドが無いので、自作しなければならないのですが、以下は、シート機能のSORTを利用して並べ替えを行う例です。
ご例示の内容から、3階層まで対応すれば良さそうと仮定して、簡略化してあります。

※ アクティブシートのA列を並べ替えます。
  範囲が違う場合は修正してください。

Sub test()
Dim r As Range, c As Range
Dim n As Long, v

Set r = Range("A1").Resize(Cells(Rows.Count, 1).End(xlUp).Row)
Columns("B:D").Insert
For Each c In r.Cells
v = Split(c.Text, "-")
n = Application.Min(UBound(v) + 1, 3)
If n > 0 Then c.Offset(, 1).Resize(, n).Value = v
Next c

Range("B1").Offset(r.Rows.Count).Value = 1
Range("B1").Offset(r.Rows.Count).Copy
r.Offset(, 1).Resize(, 3).PasteSpecial Operation:=xlMultiply
r.Resize(, 4).Sort Range("B1"), 1, Range("C1"), , 1, Range("D1"), 1

Columns("B:D").Delete
Range("A1").Select
End Sub
この回答への補足あり
    • good
    • 1

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