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

以前に似た質問をさせて頂きました時は、マクロ以外のご回答を頂きましたので、
今回は、「 マクロの回答 」 をお願いしたいと投稿いたしました。

何卒、ご教授くださいませ。

A列 の 下6桁 を除く数字は、 必ず、 1 ~ 10 です。
その 「 A列を優先キー 」 にて、「 複数の各レコードごと 」 を、 希望順 に入れ替えたいんです。

たとえば 「 4****** だけのレコード全部 ( 連続してます ) 」 を 「 エリア1 」 と 表現させて頂ます。 
* 部分は、 必ず 6 桁 です。

左隅の数字 は 1 ~ 10 までだけ変動します。
このエリアの数は、 2 ~ 3 まで変動します。
------------------------------------------------  
下記例は、エリアの数が 3つ で、 
   左隅の数字 4、 2、 10  の場合です。

実行前 ( エリア順が 4、2、10 です )
A列
4******


4******
2******


2******
10******

10******

↓↓↓
実行後1 ( エリア順を 10、4、2 にさせたい。 実際には、エリア順は全部で5通りになります。 )
A列
10******

10******
4******


4******
2******


2******

A 回答 (6件)

こちらが想定してるのと違ってるようですね。



あー。読み直して理解しいました。
A列は 4だけが入ってるのではなくて、4******が入っているのですね。
B列以降はまた別途データが入っている、と。

修正しました。

Sub a()

Dim sort_key As String
Dim sDataArray As Variant

Dim i As Long
Dim j As Long

sort_key = InputBox("ソートキーを入力してください" & vbCrLf & "1,2,3みたいな感じで入力してください")

'/*
'/* 入力内容分割
'/*
sDataArray = Split(sort_key, ",", -1, vbTextCompare)


'/*
'/*  256列に暫定ソートキーを設定
'/*
For i = 0 To UBound(sDataArray)

j = 1
Do Until Cells(j, 1) = ""

'桁数の考慮を追加しました。
Select Case Len(Cells(j, 1))
Case 7
'7桁だったら先頭1桁と比較
If Val(Mid(Cells(j, 1), 1, 1)) = Val(sDataArray(i)) Then
Cells(j, 256) = i
End If
Case 8
'8桁だったら先頭2桁と比較
If Val(Mid(Cells(j, 1), 1, 2)) = Val(sDataArray(i)) Then
Cells(j, 256) = i
End If
Case Else

MsgBox ("桁数がへんっすー")
End Select


j = j + 1
Loop

Next

'/*
'/*  暫定ソートキーでソート
'/*
Cells.Sort Key1:=Range("IV1"), Order1:=xlAscending, Header:=xlGuess

'/*
'/*  暫定ソートキーを削除
'/*

Columns("IV:IV").Select
Selection.Delete Shift:=xlToLeft
Range("A1").Activate

End Sub
    • good
    • 0
この回答へのお礼

私の質問内容の不十分で、大変お手数をおかけいたしまして、申し訳ござしませんでした。
誠に、有難うございました。

お礼日時:2007/01/03 00:35

A列


4******
4******
4******
4******
4******
4******
2******
2******
2******
2******
2******
10******
10******
10******

上記のような場合、10,4,2の順にしたいばあいは
10,4,2
と入力してください

5パターンに制限されることなく、A列の並べたい順に入力してください。
A列が、3、4の二つしかなく4******,3******の順にしたいときは
4,3
と入力してください

この回答への補足

度々、大変、恐れいります。
>上記のような場合、10,4,2の順にしたいばあいは
10,4,2
と入力してください

も試みましたが、同様に、動作する(エラーにはならない)のですが、 全く動かないんですが?
当方のどこかに問題があると思いますが、それが解りません。

1、標準モジュール に貼り付けましたが、よろしいでしょうか?
2、どこかを編集する必要がおありでしょうか?
3、それと、自身なりに IV列を 確認しましたが、空白のままになっている IV列を 削除しているようなんですが?
4、当方は、Excel 2002 です。
----------------
恐れ入ります、再確認ですが、

ファイル名は、*******.CSV
A列
4062501
4062502
4062504
4062505
2062502
2062503
2062505
10062510
10062511
10062512

上記のような場合、10,4,2の順にしたい場合は、
10,4,2
と入力すればよろしいわけでしょうか?

試みましたが、同様に、動作する(エラーにはならない)のですが、 全く動かないんですが?

以上 よろしくお願い致します。

補足日時:2007/01/02 17:27
    • good
    • 0

こんな感じでしょうか?



IV列を暫定で使用してますので、IV列を既に使用済みでしたら別列にしてください。

Sub a()

Dim sort_key As String
Dim sDataArray As Variant

Dim i As Long
Dim j As Long

sort_key = InputBox("ソートキーを入力してください" & vbCrLf & "1,2,3みたいな感じで入力してください")

'/*
'/* 入力内容分割
'/*
sDataArray = Split(sort_key, ",", -1, vbTextCompare)


'/*
'/*  256列に暫定ソートキーを設定
'/*
For i = 0 To UBound(sDataArray)

j = 1
Do Until Cells(j, 1) = ""


If Val(Cells(j, 1)) = Val(sDataArray(i)) Then

Cells(j, 256) = i

End If

j = j + 1
Loop

Next

'/*
'/*  暫定ソートキーでソート
'/*
Cells.Sort Key1:=Range("IV1"), Order1:=xlAscending, Header:=xlGuess

'/*
'/*  暫定ソートキーを削除
'/*

Columns("IV:IV").Select
Selection.Delete Shift:=xlToLeft
Range("A1").Activate

End Sub

この回答への補足

誠に申し訳ございません、動作する(エラーにはならない)のですが、 全く動かないんですが?
私の質問の例でしたら、ソートキーを
3,1,2
と 入力すればよろしいわけでしょうか?
それとも 312 でしょうか?

よろしくお願い致します。

補足日時:2007/01/02 00:06
    • good
    • 0

#2です。

関数による回答で、お呼びじゃないのは判りますが、結果はこういうので良いでしょうか。
これをVBAコードでッ実現するのは、たやすいのですが。
結果は下記でよいのか、補足していただければ幸いです。
データ
A列  B列
B列は=RANDBETWEEN(1,100)で出したもの
8******51
5******14
5******61
7******77
10******65
9******99
6******88
4******5
6******98
8******84
8******83
7******14
9******61
5******17
4******50
6******46
4******20
10******2
B列でソート(順をランダム化するため
結果
C列は=IF(MID(A1,LEN(A1)-6,1)="0",MID(A1,LEN(A1)-7,2),MID(A1,LEN(A1)-6,1))*1 で出したもの。
A列  B列  C列
4******604
5******745
6******306
7******527
8******358
4******564
5******195
6******146
4******194
5******1005
6******566
7******397
8******878
9******819
10******4710
8******938
9******1009
10******4110
C列でソート。
10******7110
10******2610
9******149
9******149
8******708
8******468
8******888
7******767
7******487
6******486
6******936
6******576
5******85
5******545
5******865
4******414
4******74
4******134

この回答への補足

すみません、重要な質問内容のミスです。
>たとえば 「 4****** だけのレコード全部 ( 連続してます ) 」 を 「 エリア1 」 と 表現させて頂ます。
↓↓↓ 訂正です。
下記例の「 4****** 」は「 4****** だけのレコード全部 ( 4だけが全く同じのデータが続いてます ) 」 を 「 エリア1 」 と 表現させて頂ます。
必ず、左端の数字は同じに続いており、連続ではありません。 
-------------------------
実行前 ( エリア順が 4、2、10 です ) 
A列
4******
4******
4******
4******
4******
4******
2******
2******
2******
2******
2******
10******
10******
10******
↓↓↓
実行後1 ( エリア順を 10、4、2 にさせたい。 実際には、エリア順は全部で5通りになります。 )
A列
10******
10******
10******
4******
4******
4******
4******
4******
4******
2******
2******
2******
2******
2******
--------------------------

補足日時:2007/01/01 16:51
    • good
    • 0
この回答へのお礼

どうも、有難うございました。

お礼日時:2007/01/03 00:36

> 複数の各レコードごと 」 を、希望順に並び替えるマクロは 


これは書かなくても良い文章です。
また「レコード」は、エクセルせは「行」で表されるので、仰々しい。これをテキスト形式やMDB形式のファイルに変換すれば、レコードという考えが正面に出てくる。「複数の」もソートにおいては当たり前のケースで、書けば却って何か?と思ってしまう。
コンピュターのソートは、基本的に、昇順、降順とソートキー(ソート列、どの列でソートするのか)しか指定できません。
それ以上は、自分がソートしてほしいように、修正キーを各レコード(各行)に(多分別列に)「作る」必要があります。
作ってしまえば、VBAでもコード2行で済んでしまいます。
プログラムなどでは、レコードの後尾などに、フィールドとして、修正キー項目を付け加えたりすることも多い。
かっての、コンピュター作業は、ソート+処理が基本で、これが死命を握ってました。
ーー
キーが4(列)つ以上の場合なら、エクセルの質問に値しますでしょうが、本件はこれには関係ないらしい?
ーーー
補足要求
(1)本件は、大筋右から7桁目の1桁でソートすればよいが、10の場合は右から7桁目から2桁採らないといけないようですが、これが異例となります。右から7桁目が0の場合だけ2桁採ればよいのでしょうか?
ーーー
(2)希望通り、ソート後に、右から7桁目が例えば2のものだけを、別シートに分離
したいとかの要求はあるのですか。
(3)>このエリアの数は、 2 ~ 3 まで変動します。
この意味は?
データの内容の実情であって、プログラムに影響しないのでは?。
プログラムのことが判らないのだから、やむをえないのだが、質問文に書かなくても良いことが描いてある感じがする。
 もっと質問点を絞る訓練が必要。そうしないと、全てVBAコード作ってください式になってしまう。
ーー
要望
関連前問が有るようですが、その番号を書いておけば、問題の意味の
理解に役立つので、書いておいてはどうでしょう。

この回答への補足

すみません、重要な質問内容のミスです。
>たとえば 「 4****** だけのレコード全部 ( 連続してます ) 」 を 「 エリア1 」 と 表現させて頂ます。
↓↓↓ 訂正です。
下記例の「 4****** 」は「 4****** だけのレコード全部 ( 4だけが全く同じのデータが続いてます ) 」 を 「 エリア1 」 と 表現させて頂ます。 
-------------------
>(1)本件は、大筋右から7桁目の1桁でソートすればよいが、10の場合は右から7桁目から2桁採らないといけないようですが、これが異例となります。右から7桁目が0の場合だけ2桁採ればよいのでしょうか?
はい、おっしゃられる通りでございます。

>(2)希望通り、ソート後に、右から7桁目が例えば2のものだけを、別シートに分離
したいとかの要求はあるのですか。
「 別シートに分離したい 」は一切ございません。
ただ、後に、このシート上で、A列も含めて、マクロにて置換え、ソート等はいたしますので、各セルのデータ内容は変更されては困ります。
(都合上、もし列が追加された場合は、その列を削除しますので追加は結構です。)

>(3)>このエリアの数は、 2 ~ 3 まで変動します。
この意味は?
今回の質問は、エリアの数は、 3 ですが、 2 の場合の時もあるということです。
 すみません余分(2の場合は、上下入れ替えの1通りだけです)でした、今回は 3 だけ(下記例だけ) で結構です。
また、「全てVBAコード作ってください式」ではなくて、もちろん関数等と混合しても結構です。

>要望
http://oshiete1.goo.ne.jp/qa2631898.html
未熟な私の判断(使用してみた結果)ですと、
このご回答の場合、A列の数字(1~10)を軸にしていると思いましたので、119通り(エリアの数が3の場合)になると思った次第でございます。

今回の質問で、A列のエリア順(1・2・3)を軸にし、5通り(エリアの数が3の場合)にしたいと思ったからです。

補足日時:2007/01/01 16:47
    • good
    • 0

エクセルで処理すると前提で補足お願いします。



1.ソートしたいものは、全てA列に収まっているのでしょうか?
あるいは、A列には1~10のみでB~G(6桁)にのこりの可変”*”が入っているのでしょうか?

2.ソートの順番指定は5通りとのことですが、どのように指定したいのでしょうか?

この回答への補足

即答、誠に有難うございます。
大変恐れいります。

>1.ソートしたいものは、全てA列に収まっているのでしょうか?
A列だけを 「 最優先されるキー 」 にてレコードごとをソートしたいのです。

>あるいは、A列には1~10のみでB~G(6桁)にのこりの可変”*”が入っているのでしょうか?
質問画面の例の通りで、B列以降は、他のデータなので、無視されて結構です(但し、各セルのデータ内容が変更されては困ります)。
B列以降は、A列だけを 「 最優先されるキー 」 にてソートされるだけで結構でございます。

>2.ソートの順番指定は5通りとのことですが、どのように指定したいのでしょうか?
例えば、
今回の質問の「1通り」は、エリア順 「 1・2・3 」 → 「 3・1・2 」にしました。
他は、             エリア順 「 1・2・3 」 → 「 3・2・1 」にします。
他は、             エリア順 「 1・2・3 」 → 「 2・3・1 」にします。
他は、             エリア順 「 1・2・3 」 → 「 2・1・3 」にします。
他は、             エリア順 「 1・2・3 」 → 「 1・3・2 」にします。            
他は、             エリア順 「 1・2・3 」 → 「 1・2・3 」にします。× 同じなので不必要。 
以上で、合計5通りでございます。           

よろしくお願い致します。

補足日時:2007/01/01 15:17
    • good
    • 0

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