No.3ベストアンサー
- 回答日時:
単純な以下でどうなりますか
指定したその場所で更新します
Public Sub Samp1()
Dim rng As Range
Dim v As Variant
Dim i As Long, j As Long
Set rng = Range("A2:D3") ' 場所指定
For i = 1 To rng.Count - 1
For j = i + 1 To rng.Count
If (rng(j) <> "") Then
If ((rng(i) = "") Or (rng(i) > rng(j))) Then
v = rng(i)
rng(i) = rng(j)
rng(j) = v
End If
End If
Next
Next
End Sub
※ 山梨と高尾の順が違いますけど
問い)
上記処理は単純に文字列として比較しているだけですが、
後ろの数字部分について
・2桁になることはありますか?
(高尾2 と 高尾11 を単純比較すると、高尾11、高尾2の順に)
・半角/全角混在しますか?
・数字前文字の出現個数が多い順ですか?
上記問いが全て「はい」で
・数字部分の始まりに 0 はない
・数字前にカタカナはない
の条件の時、雰囲気以下?
Public Sub Samp2()
Dim dic As Object, dicC As Object
Dim vA As Variant, vK As Variant, v As Variant
Dim vC As Variant
Dim sS As String, s As String
Dim i As Long, j As Long, k As Long, n As Long
Set dic = CreateObject("Scripting.Dictionary")
Set dicC = CreateObject("Scripting.Dictionary")
With Range("A2:D3")
vA = .Value
For i = 1 To UBound(vA)
For j = 1 To UBound(vA, 2)
If (vA(i, j) <> "") Then
sS = StrConv(vA(i, j), vbNarrow)
s = ""
n = 0
For k = 1 To Len(sS)
If (Mid(sS, k, 1) Like "[0-9]") Then
n = Val(Mid(sS, k))
sS = Left(vA(i, j), k - 1)
s = Mid(vA(i, j), k)
Exit For
End If
Next
If (s = "") Then sS = vA(i, j)
If (Not dic.Exists(sS)) Then
dic.Add sS, CreateObject("Scripting.Dictionary")
End If
dic(sS)(n) = s
vA(i, j) = ""
End If
Next
Next
For Each vK In dic.Keys
i = dic(vK).Count
If (Not dicC.Exists(i)) Then
dicC.Add i, CreateObject("Scripting.Dictionary")
End If
dicC(i)(vK) = Empty
Next
i = 1
j = 1
For Each vC In mySortDesc(dicC.Keys)
For Each vK In mySort(dicC(vC).Keys)
For Each v In mySort(dic(vK).Keys)
vA(i, j) = vK & dic(vK)(v)
j = j + 1
If (j > UBound(vA, 2)) Then
i = i + 1
j = 1
End If
Next
Next
Next
.Value = vA
End With
Set dic = Nothing
Set dicC = Nothing
End Sub
Private Function mySort(ByVal vA As Variant) As Variant
Dim v As Variant
Dim i As Long, j As Long
For i = LBound(vA) To UBound(vA) - 1
For j = i + 1 To UBound(vA)
If (vA(i) > vA(j)) Then
v = vA(i)
vA(i) = vA(j)
vA(j) = v
End If
Next
Next
mySort = vA
End Function
Private Function mySortDesc(ByVal vA As Variant) As Variant
Dim v As Variant
Dim i As Long, j As Long
For i = LBound(vA) To UBound(vA) - 1
For j = i + 1 To UBound(vA)
If (vA(i) < vA(j)) Then
v = vA(i)
vA(i) = vA(j)
vA(j) = v
End If
Next
Next
mySortDesc = vA
End Function
Samp1、Samp2を実施してみました。どちらでも一発処理でできました。有難う御座いました。
今から、頂いたcodeを一行一行で読んでみます。
No.2
- 回答日時:
No.1です。
コーディングに時間かかってすみません。
以下 表の並び替えのコードです。
↓ここから
Sub 表並び替え()
Dim nRow, nCol, nCount ' カウント用変数
Dim maxRow, maxCol ' 表の最大列、最大行
Dim sheet
sheet = "Sheet1" ' シート名(適宜変更してください)
' 最大行と最大列取得
maxRow = Range("A65536").End(xlUp).Row
maxCol = Range("XFD1").End(xlToLeft).Column
' 表を行に変換
For nRow = 1 To maxRow
For nCol = 1 To maxCol
nCount = nCount + 1
Cells(maxRow + 1, nCount) = Cells(nRow, nCol)
Next nCol
Next nRow
' 並び替え実行
ActiveWorkbook.Worksheets(sheet).Sort.SortFields.Clear
ActiveWorkbook.Worksheets(sheet).Sort.SortFields.Add Key:=Range(Cells(maxRow + 1, 1), Cells(maxRow + 1, nCount)) _
, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets(sheet).Sort
.SetRange Range(Cells(maxRow + 1, 1), Cells(maxRow + 1, nCount))
.Header = xlGuess
.MatchCase = False
.Orientation = xlLeftToRight
.SortMethod = xlPinYin
.Apply
End With
' カウント初期化
nCount = 0
' 行を表に変換
For nRow = 1 To maxRow
For nCol = 1 To maxCol
nCount = nCount + 1
Cells(nRow, nCol) = Cells(maxRow + 1, nCount)
Next nCol
Next nRow
' 並び替え用に作成した行削除
Range(Cells(maxRow + 1, 1), Cells(maxRow + 1, nCount)).Clear
End Sub
↑ここまで
ご存知かもしれませんが念のためマクロ実行方法
URL:http://kokodane.com/2010/excel2010macro_02.htm
マクロの編集で上のコード丸丸コピペして
実行してください。
編集の際に自動的に作成される
初期コードも全部消してから実行してください。
sheet = "Sheet1" ' シート名(適宜変更してください)
6行目に上記のコードがありますが、
"Sheet1"のところはその表のあるシート名を記入してください。
申し訳ないのですが、漢字はソートしたときに
思った通りの並び順にならないかもしれません。
希望がありましたら、言ってください。
なんとかならないか試してみます。
漢字・記号以外の並び替えはちゃんとできます。
私はExcel2007では動作確認しましたが、
もしかしたら2010ではエラーが出てしまうかも
しれませんので、上手く行きませんでしたら
言ってください。直します。
No.1
- 回答日時:
3つお伺いしたい点があります。
1. 回答はマクロでも良いですか?
2. 実際に並び替えを行いたい表の
データ数はどのくらいなのですか?
3. 質問者様のExcelは2003以前か2007以降か
教えてください。
行で並び替えを行いたいようなので、データ量が多く
2003以前であるなら、私もやりかた分からないかもです...。
早速の返事、誠にありがとうございました。
1 マクロでも、他の手段でも大丈夫です。
2 多くないです。セル数から言うと、何十個程度です。
3 excel 2010です。
是非、よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 指定した文字から指定した文字のスペースまでを削除するVBAの構文について 6 2022/07/24 22:20
- Excel(エクセル) Excelのマクロについてご教授ください 2 2023/02/25 09:43
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2022/12/26 12:05
- Excel(エクセル) 関数EXACT(文字列,文字列)とexcelVBA 3 2022/04/14 15:07
- Visual Basic(VBA) ExcelVBAの複数指定範囲の構文 2 2022/05/26 22:39
- Excel(エクセル) Excel VBAで、行の高さを、上下1文字分程度高くしたい 3 2023/04/23 00:17
- Excel(エクセル) エクセルの数式で教えてください。 1 2023/02/15 08:30
- Excel(エクセル) エクセルの数式について教えてください。 2 2023/03/04 09:54
- Excel(エクセル) エクセル 条件に合う日付に入力された時間数の合計したい 4 2022/06/17 22:18
- Visual Basic(VBA) Excelのマクロコードについて教えてください。 1 2022/03/27 13:25
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA Shapes コピーと名前
-
【Excel】マクロでページを追加...
-
エクセルファイルを値でのみし...
-
EXCEL VBA 他のアプリケーショ...
-
セルに入力するたびにマクロを...
-
エクセル連番自動印刷について
-
Excelでマクロ実行中に画面を固...
-
エクセル 図形の寸法を取得したい
-
EXCEL 行番号や列番号が選択で...
-
エクセル マクロ写真帳に一括で...
-
エクセルのマクロについて教え...
-
VBAで行コピーして挿入
-
エクセルVBAで納期管理システム...
-
VBAの記述について 値のみの貼...
-
再度,ExcelVBA,public変数が消える
-
シート名を記入する
-
CSVデータをEXCELのテーブルに...
-
ブックの共有でVBAエラー
-
エクセルに写真を挿入するマ...
-
VBでエクセルに罫線を引くには?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルファイルを値でのみし...
-
エクセルのマクロについて教え...
-
Excelでマクロ実行中に画面を固...
-
VBA Shapes コピーと名前
-
エクセル マクロ写真帳に一括で...
-
エクセル連番自動印刷について
-
エクセル 図形の寸法を取得したい
-
【Excel】マクロでページを追加...
-
セルに入力するたびにマクロを...
-
エクセルVBAで納期管理システム...
-
ブックの共有でVBAエラー
-
EXCEL VBA 他のアプリケーショ...
-
VBAで行コピーして挿入
-
EXCEL 行番号や列番号が選択で...
-
【ExcelVBA】マクロブックを通...
-
ExcelのVBAで自動採番したい...
-
エクセルファイルの回数期限の...
-
シート名を記入する
-
VB.NETによるEXCELの行挿入
-
エクセルのマクロを教えてください
おすすめ情報