No.10ベストアンサー
- 回答日時:
#7です
> Const CCOLR As String = "D" ' A ~ この列まで
これを指定させるのはどうだろうか・・・と思っていたのですが
> 空白は無視するので、とびとびでも
この、とびとび・・・
CurrentRegion で、最終列を取得できるのか??
で、最終列を記述してもらうものにしてましたが、
空白あるのは各列の行後半・・・
という使い方なら CurrentRegion で取得できるので
使い勝手は向上するのかなということで
Samp2 からの変更点は ★ 部分だけです
Public Sub Samp3()
Dim rng As Range, r As Range
Dim i As Long, j As Long, k As Long
Application.ScreenUpdating = False
k = Range("A1").CurrentRegion.Columns.Count ' ★
With Columns(k) ' ★
.Offset(, 1).Resize(, k + 2).ClearContents
.SpecialCells(xlCellTypeConstants) _
.Copy .Offset(, k + 1).Cells(1)
Set rng = .Offset(, k + 1).CurrentRegion
End With
For i = k - 1 To 1 Step -1
j = 0
For Each r In Columns(i).SpecialCells(xlCellTypeConstants)
With rng.Offset(j * rng.Rows.Count)
If (j > 0) Then rng.Copy .Cells(1)
.Columns(1).Offset(, -1) = r
End With
j = j + 1
Next
Set rng = rng.CurrentRegion
Next
Application.ScreenUpdating = True
End Sub
#4のお礼に
> やっている事は解らないのですが
とあったので、チョット解説を・・・数学的な話にはならない?かな?
図にあるように、3 x 3 で説明してみます
For の前までに何をやっているか
まず、結果を表示する列幅+左右1列の範囲をきれいにしておいて
処理対象の最終列の内容をコピーして、塊として覚えます(赤枠)
(図上段)
For に入って
最終列の前の列から順に、1データずつ
「A」の時は、覚えていた塊の1列目左の範囲に「A」を
「B」の時は、塊単位で行をずらしてコピーして(図中段)
その塊の1列目左の範囲に「B」を
「C」も同様の処理を繰り返し、その列を処理しきると(図下段)
その状態を、塊として覚えなおして
さらに前の列「1」の時には、その塊の1列目左の範囲に「1」を
「2」の時は、塊単位で行をずらしてコピーして、
その塊の1列目左の範囲に「2」を・・・と繰り返していきます
列数が多いと、塊として覚えなおす回数が増えますが、
それは Excel さんがやってくれることなので・・・
再度の回答、そして解りやすいご説明を頂き、ありがとうございます。
なるほどなぁ、と思える説明で、後は私がコードを書けるようになれば良い訳ですね。
最後までお付き合い頂き大変感謝しております。
ありがとうございます!
No.9
- 回答日時:
作業列使えば理解しやすいかもってことで最終回答
1. 1行目の上に2行挿入
2. D2セルに =COUNTA(D3:D50)
左へオートフィル セル範囲は適宜
3. D1セルに =PRODUCT(D2:$D$2)
左へオートフィル
4. F1セルに
=INDEX(A:A,MOD((ROW(A1)-1)/A$1*A$2,A$2)+3)
右へ、下へオートフィル 添付図では60行目まで
噛み砕いて教えて頂きありがとうございます。
お陰様で、ばっちり出来たようです、再度の回答を頂き感謝いたします。
ちょっと考えてみます、ありがとうございました。
No.8
- 回答日時:
>数式のやっている事が理解できなくて、よろしければ列と行がランダムに増加した時の対応方法を教えて頂けませんでしょうか
ランダムって言われても余計難しくなるだけですよ?
No.1さんの回答が分からないうちは、無理だと思います。
まぁ
>20×20×20×20の80000通りになります
は16万通りの間違いですが。
ー*-*-*-*-
整数において
十進法は1桁で10個の種類がある(0~9)
十進法は2桁で10*10個の種類がある(0~99)
十進法は3桁で10*10*10個の種類がある(0~999)
ー*-*-*-*-
D列を右から第1桁めとして3つの種類がある。
C列を右から第2桁めとして3つの種類があるとして、D列とあわせて3*3種類できる
B列を右から第3桁めとして3つの種類があるとして、C~D列とあわせて3*3*3種類できる
A列を右から第4桁めとして3つの種類があるとして、B~D列とあわせて3*3*3*3種類できる
ー*-*-*-*-
ランダムっていう場合
D列を右から第1桁めとして2つの種類がある。
C列を右から第2桁めとして5つの種類があるとすると、D列とあわせて5*2種類
B列を右から第3桁めとして3つの種類があるとすると、C~D列とあわせて3*5*2種類
A列を右から第4桁めとして2つの種類があるとすると、B~D列とあわせて2*3*5*2種類
ー*-*-*-*-
>>=INDEX(A:A,MOD((ROW(A1)-1)/3^(4-COLUMN(A1)),3)+1)
は各桁数(各列の行数)が同じ場合しか対応していません。
そのほうが単純にできるからです。
ランダムの場合、それぞれの列に合うような作りになるため、上記の場合が理解できないようでは、提示する気はありません。
頑張れば一つの数式でできるのかもしれませんが。
No.7
- 回答日時:
#4です
> 空白は無視する、なんて事できるのでしょうか?
そう変更量は多くありません
空白は無視するので、とびとびでも
※ 列には1つ以上の空白では無い
SpecialCells(xlCellTypeConstants) で取得できるものがあること
(数式ではなく、値で埋まっていること:数式は対象外に)
Public Sub Samp2()
Dim rng As Range, r As Range
Dim i As Long, j As Long, k As Long
Const CCOLR As String = "D" ' A ~ この列まで
Application.ScreenUpdating = False
With Columns(CCOLR)
k = .Column
.Offset(, 1).Resize(, k + 2).ClearContents
.SpecialCells(xlCellTypeConstants) _
.Copy .Offset(, k + 1).Cells(1)
Set rng = .Offset(, k + 1).CurrentRegion
End With
For i = k - 1 To 1 Step -1
j = 0
For Each r In Columns(i).SpecialCells(xlCellTypeConstants)
With rng.Offset(j * rng.Rows.Count)
If (j > 0) Then rng.Copy .Cells(1)
.Columns(1).Offset(, -1) = r
End With
j = j + 1
Next
Set rng = rng.CurrentRegion
Next
Application.ScreenUpdating = True
End Sub
再度の回答を頂き、ありがとうございます。
やってみたところ、無事出来ました。
普段は数学や数式と無縁な生活をしていますので、教えて頂き大変助かりました。
ありがとうございました。
No.5
- 回答日時:
数式では限界かな~とか思いつつ F1セルに
=INDEX(A:A,MOD((ROW(A1)-1)/3^(4-COLUMN(A1)),3)+1)
右へ、下へオートフィル
回答ありがとうございます。
数式のやっている事が理解できなくて、よろしければ列と行がランダムに増加した時の対応方法を教えて頂けませんでしょうか。
No.4
- 回答日時:
VBA ですが良いでしょうか
Rows.Count を超えた時にはポンとなります
それまでは、A1 の CurrentRegion を処理対象として結果を出力します
5 x 5、4 x 6、9 x 3 ・・・ でも
Public Sub Samp1()
Dim rng As Range, r As Range
Dim i As Long, j As Long, k As Long
Application.ScreenUpdating = False
With Range("A1").CurrentRegion
k = .Columns.Count
.Offset(, k + 1).Resize(, k + 1) _
.EntireColumn.ClearContents
With .Columns(k)
.Copy .Offset(, k + 1)
Set rng = .Offset(, k + 1).CurrentRegion
End With
For i = k - 1 To 1 Step -1
j = 0
For Each r In .Columns(i).Cells
With rng.Offset(j * rng.Rows.Count)
If (j > 0) Then rng.Copy .Cells(1)
.Columns(1).Offset(, -1) = r
End With
j = j + 1
Next
Set rng = rng.CurrentRegion
Next
End With
Application.ScreenUpdating = True
End Sub
※ これは先月他サイトで回答したものになります
A1~A5、A1~D5まで一つのセルに1桁の数値があります。
http://detail.chiebukuro.yahoo.co.jp/qa/question …
回答ありがとうございます。
うーん・・・・さすがマクロです、
やっている事は解らないのですが、結果は見事に出来ました。
それで、例えばこの表が8×7×4×3×4×5などとなった場合はどこを改変すれば良いでしょうか?
お手数ですが、教えて頂けませんでしょうか。
よろしくお願いいたします。
No.3
- 回答日時:
セル F1 に次式を入力して、此れを右方に(セル F1 まで)ズズーッドラッグ&ペーストした後に、範囲 F1:I1 を下方に(数値の 1 が出る直前にストップ!)ズズーッとドラッグ&ペースト
=OFFSET($A$1,MOD((ROW(A1)-1)/3^(4-COLUMN(A1)),3),COLUMN(A1)-1,)
【お断り】苦手な“講釈”は割愛しました。
回答いただきありがとうございます。
ばっちり出来ました・・・・が、私にはどうやっているのか理解できそうもありません。
今回の3×4では無く、例えば8×8になった時はどのように対応したら良いでしょうか?
お手数ですが、教えて頂けませんでしょうか。
よろしくお願いいたします。
No.1
- 回答日時:
長くなります
覚悟してください
理由は質問が間違った条件を示しているのでそれを訂正することと
最後に示す数式を自身で修正できるようにするためです
前置きはこのくらいで条件の訂正について書きます
そもそも条件が不定ですので答えられません
縦方向に3パターン、横方向に4種類なら
3×3×3×3の81通りになります
しかし、実は縦方向に3パターンではなく20パターンの入力ができるとしたら
20×20×20×20の80000通りになります
縦方向に3パターン、横方向に4種類と意図した質問であれば1行に入力されたパターンを進数と見なすとよい
入力されるのは記号ではなく数値と考えると分かりやすいでしょう(2進数とか10進数とか16進数の進数)
質問の例では3進数の4桁で示すことのできる数のパターン数ということになる
縦方向に10パターン、横方向に4種類であれば10進数の4桁で示すことのできる数のパターンは
10×10×10×10の10000通りになるのは理解できると思います
この考え方ならば列ごとに異なるパターンで入力されるとしても最大の入力パターンは計算できます
A列に3パターン、B列に5パターン、C列に2パターン、D列に16パターンなら
3×5×2×16=480通りと言うことになる
では本題の数式について
私なら上のような考え方で
ROW関数でセルの行数を求めその値を元に数学的な処理をして各桁に数値を割り振り
振り分けられた数字に対して入力される文字を割り付けます
MOD(ROW(A1)-1,桁のパターン数)+1
※これが基本
何をやっているのかよく考えて理解してください
CHOOSE関数でパターンを割り当てる
CHOOSE(MOD(ROW(A1)-1,桁のパターン数)+1,パターン1,パターン2,…)
1桁目=CHOOSE(MOD(ROW(A1)-1,1桁目のパターン数)+1,1桁目のパターン1,1桁目のパターン2,…)
2桁目=CHOOSE(MOD(INT(ROW(A1)-1/(1桁目のパターン数),2桁目のパターン数)+1,2桁目のパターン1,2桁目のパターン2,…)
3桁目=CHOOSE(MOD(INT(ROW(A1)-1/(1桁目のパターン数*2桁目のパターン数),3桁目のパターン数)+1,3桁目のパターン1,3桁目のパターン2,…)
4桁目=CHOOSE(MOD(INT(ROW(A1)-1/(1桁目のパターン数*2桁目のパターン数*3桁目のパターン数),4桁目のパターン数)+1,4桁目のパターン1,4桁目のパターン2,…)
・
・
・
と必要なだけ「1行目」に作る
この数式を入力した列(E列とかD列)を選択して必要な行までコピーする(質問の例なら81行まで)
【注意!!】
縦方向に9パターン、横方向に9種類であれば、
9×9×9×9×9×9×9×9×9で387,420,489通りになります
これはちょっと現実的ではありません
そもそもExcel2007以降のバージョンでは最大1,048,576行までしか使えないのです
(Excel2007よりも前のバージョンでは16,384列まで)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) エクセルVBAについて 2 2023/01/31 16:21
- Excel(エクセル) エクセルに代わる 表入力ツールについて 3 2022/12/21 21:19
- WordPress(ワードプレス) ワードプレスで、左寄せ画像と文字を横並びにせず、画像の下に文字を表示される方法を教えてください 1 2022/04/24 11:06
- Excel(エクセル) 条件に合った数値の合計を表示させたい関数と条件指定の方法 3 2023/05/13 16:07
- Visual Basic(VBA) エクセルの数式で教えてください。 1 2023/07/31 15:49
- ノートパソコン ExcelファイルがDoxillionに突然、変わってしまい、エクセルファイルが開かず困っています。 4 2022/09/22 07:02
- Excel(エクセル) エクセルのAltを押すと「自動保存」「上書き保存」・・・に白抜きの「1」「2」・・・が出る。 2 2023/08/11 11:39
- 数学 情報処理詳しい人!! A4縦のレポート文書に4:3の大きさの横向きの写真画像を貼り付けることにした。 2 2022/12/18 02:30
- Excel(エクセル) Excel 記入欄に網掛けして、文字が入力されたら網掛けが消える設定 5 2023/02/05 11:00
- Excel(エクセル) エクセルのマクロで複数条件に当てはまるものを全て抽出したいです 7 2022/05/21 08:51
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【関数】スペースがいくつ入っ...
-
西暦や和暦の表示をyyyymmdd表...
-
【Microsoft Office Excel Comp...
-
Excelはなんで先頭の0を消すん...
-
Excelのセルを飛ばして入力する
-
別シートからの文字を変更
-
エクセルの行の抽出について質...
-
Excelのオートフィル
-
Excel 2019 のピボットテーブル...
-
スプレッドシート クエリ関数 1...
-
excelの不要な行の削除ができな...
-
Excel初心者です。 詳しい方、...
-
【Excel】セル内の時間帯が特定...
-
Excel初心者です。 詳しい方、...
-
EXACT関数とIF関数の組み合わせ...
-
Excelのグラフ軸について
-
スマートな関数を教えて下さい。
-
Excelで全角を半角にしたいので...
-
【マクロ】エクセルにかいてあ...
-
Excel:一部のフォントでセルの...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ファイル内にある数字の出現回...
-
Excel関数の先頭に「@」が入っ...
-
エクセルの気味悪い不思議
-
Excel VBAで、実行時にsheet上...
-
表示されている人数だけを数え...
-
他人が作ったマクロの理解
-
Excelの関数について質問です。
-
Excel 集計表
-
エクセル 日時の計算式について
-
Excelの関数に関して質問です。...
-
エクセル:セル内の文字列の下...
-
絞り込み検索
-
エクセルの関数で
-
エクセルの書式設定について教...
-
余分なEXCELファイルに印刷され...
-
VBA 同一シート内での転記の仕方
-
長期休みの関数はありますか
-
Excelの空のセル
-
エクセルで入力してある文を別...
-
Excelのマクロで、セルを結合し...
おすすめ情報
画像に間違いがありました 正確には 3の4乗で 81通りになるはずです。
ご指摘いただいたmikeさんありがとうございます。
失礼しました、単純に列に文字を入れれば対応してくれていました。
1点教えて頂けませんでしょうか、例えば1列目が3行で、2列目が2行の場合、2列目の空白も含んで処理をしますが、これを空白は無視する、なんて事できるのでしょうか?
お手数ですが、教えて頂ければ幸いです。
よろしくお願いいたします。