[[20170318075651]] 『マクロにてINDEX関数を使って条件の通りに作成しax(ウルトラ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『マクロにてINDEX関数を使って条件の通りに作成したい』(ウルトラ)

Webサイトのそのままの引用ですが、下の1.〜9.の条件ならばどのように設定したらよいのか、お教え下さいませんか。

    Sub Index関数の使い方()
      Dim 名前 As Variant
      名前 = WorksheetFunction.Index(Range("B5:C9"), 3, 2)
      Range("C11").Value = 名前
    End Sub

1.関数でINDEXを使ってやろうとしたのですが、1列が25列(行)のため、横の次の列への設定がうまく関数で出来なかったので、マクロを使ってできないか相談した次第です。

2.Excelのデーターがsheet1のセルのA1〜A300まである。
3.A0001・A2001・A3025とかというような受付番号がランダムにある。
4.2.に示したデーターをsheet2の座席表に表記させたい。
5.その時にセルを一つおきに入れたい。
6.A0001・A2001・A3025の番号の共通のAは外して0001・2001・3025のように入れたい。
7.縦(行)に25列・横(列)に13列で作成してある。
8.縦(行)はセルを1行ずつ開け、横(列)はセルを2列ずつ開けて番号を入れる。
9.sheet2は始まりがH14セルから始める。

< 使用 Excel:Excel2013、使用 OS:Windows7 >


行き違いがないように、もう少し説明してください。
特に書込先の位置が明確ではないように思います。

「仮に」A1からA300まで、規則正しく1,2,3・・・と入っていたとして、
Sheet2のどこのセルに書き込むのですか。
1,2,3・・・を使って説明してください。
 
300個全て書く必要はもちろんありません。
最初の10個だけで結構です。

(γ) 2017/03/18(土) 08:40


 念のため申し上げると、文章表現ではなく、
      H  I   J   K  ・・・
 14
 15
 16
 17
 といったシートレイアウト表示で書き込んで下さい。 
(γ) 2017/03/18(土) 08:45

 おはようございます。

 ご提示の説明だけでは、Sheet1とSheet2の構成は何となく分かりますが、どの順番で転記するのかが全く分かりません。
 Sheet1のデータをシート2にはどのような順番で転記したいんですか?
 誰が見ても一目で分かるように、レイアウトを添えるように心掛けて下さい。

 Sheet2のH14から横に転記して、13列目(T列?)まで行ったら下に移るんですか?
 それとも下に転記して、25行目(38行?)まで行ったら、横に移るんですか?

 >5.その時にセルを一つおきに入れたい。
 >8.縦(行)はセルを1行ずつ開け、横(列)はセルを2列ずつ開けて番号を入れる。 
 この2つは同じ事を指してるんですか?

 >6.A0001・A2001・A3025の番号の共通のAは外して0001・2001・3025のように入れたい。 
 アルファベットはAだけですか?
 Aと言う文字を消すだけで良いんですか?
 それともとにかく右から4桁の数字だけを取り出したい?

(sy) 2017/03/18(土) 08:51


(sy)さんへの回答  2017/03/18(土) 08:51
 Sheet2のH14から横に転記して、13列目(T列?)まで行ったら下に移るんですか?
 それとも下に転記して、25行目(38行?)まで行ったら、横に移るんですか?

    25行目まで行ったら、横に移ります。

 >5.その時にセルを一つおきに入れたい。
 >8.縦(行)はセルを1行ずつ開け、横(列)はセルを2列ずつ開けて番号を入れる。 
 この2つは同じ事を指してるんですか?

   縦は1行ですが、横は2列だったので、重複の表現になりました。すみません。

 >6.A0001・A2001・A3025の番号の共通のAは外して0001・2001・3025のように入れたい。 
 アルファベットはAだけですか?
 Aと言う文字を消すだけで良いんですか?
 それともとにかく右から4桁の数字だけを取り出したい?

 Aと言う文字を消すだけです

 右から5桁でした。02001・03025・00001というような取り出し方です。質問の時の番号が4桁でしたが、正確には5けたでした。

 なお、番号は途中で飛んだりして、ある程度一定の順番ですが、ランダムと言った方がよいかもしれません。

(γ)さんへの回答  2017/03/18(土) 08:45
アルファベットはAだけですか?
Aだけです。
といったシートレイアウト表示で書き込んで下さい。
このようなことです。
    HI    J   KL   M   NO  P  ・・・

 14  00001   00034   02010   03025
 15 00007   00036   02015   03055
 16  00018   00045   02024   04023
 17  00019   00689   03011   10025

(ウルトラ) 2017/03/18(土) 10:19


知りたいのは順序なので、あえて1,2,3だったとしてと指定しているのに、
趣旨が伝わらないですかね。
それとも、書き込むときに、またシャッフルしたいということ?
 
HI列ってどこですか?
14行目、15行目、16行目、17行目と連続して書き込むのですか?
話が一貫していないように思うけど。
# レイアウトを示すのが面倒で、いやなんですか?

(γ) 2017/03/18(土) 10:41


知りたいのは順序なので、あえて1,2,3だったとしてと指定しているのに、
趣旨が伝わらないですかね。
それとも、書き込むときに、またシャッフルしたいということ?

 順番にシャッフルするということではなくて、sheet1のセルのA1〜のデータをsheet2のセルH14〜に入れたいということです。
 
HI列ってどこですか?
14行目、15行目、16行目、17行目と連続して書き込むのですか?
話が一貫していないように思うけど。
# レイアウトを示すのが面倒で、いやなんですか?

「レイアウトを示すのが面倒で、いやなんですか?」
  決してそんなことはありません失礼しました。下記のように訂正しました。

なお、H14〜というのは、前の列と前の行は文言などを入れたレイアウトになっていますので、すみません、H列の14行からということになっています。これも説明不足でした、申し訳ありません。

 
sheet1のデーターが

     A
  1 A00001
  2 A00007
  3 A00018
  4 A00019
  5 A00023
   ・
   ・
   ・
   ・
   ・
 25 A00030
 26 A00034
 27 A00036
 28 A00045  
     ・
     ・
300

sheet2が下記のようにしたいのですが

    HI    J   KL   M   NO  P  ・・・

 14  00001   00034   02010   03025
 15
 16 00007   00036   02015   03055
 17
 18  00018   00045   02024   04023
 19
 20  00019   00689   03011   10025

(ウルトラ) 2017/03/18(土) 11:18


      H    I    J    K    L  (以下略)
 14   1             26 
 15
 16   2             27
 17
 18   3             28
 19   
 ・・・
 62  25             50
  (以下略)

 ということですか?  
 数値は A1から順に1,2,3であったとした場合のもの。

 たぶんこんなことでしょうか?
 Sub test()
     Dim k As Long, r As Long, c As Long

     For k = 1 To 300
         r = ((k - 1) Mod 25) * 2 + 14
         c = WorksheetFunction.Floor((k - 1) / 25, 1) * 3 + 8
         Sheet2.Cells(r, c).Value = Right(Sheet1.Cells(k, 1).Value, 5)
     Next
 End Sub

 想像はつくが、syさんからもレイアウト要望があるように、
 質問としてきちんとしたものを提示するようにしてください。

 上記が間違っていたら、そちらで必要な修正をしてください。
 これで失礼します。

(γ) 2017/03/18(土) 11:26


 >関数でINDEXを使ってやろうとしたのですが、1列が25列(行)のため、
 >横の次の列への設定がうまく関数で出来なかったので、

 H14 =RIGHT(INDEX(Sheet1!$A:$A,ROUNDUP(ROW(A1)/2,0)+ROUNDUP((COLUMN(A1)-1)/2,0)*25),5)

 H14とH15(H15は空白)を選択して、H62までフィルコピー

 H14:I62(I列は空白)を選択して、右へフィルコピー

 こんな感じでできませんか?

 参考まで。
(笑) 2017/03/18(土) 12:03

 横2列空ける? H列の次はK列?

 だったら

 H14 =RIGHT(INDEX(Sheet1!$A:$A,ROUNDUP(ROW(A1)/2,0)+ROUNDUP((COLUMN(A1)-1)/3,0)*25),5)
                                                                          ~~~
 H14:H15を選択して、62行目までフィルコピー
 H14:J62を選択して、右にフィルコピー

 参考まで。
(笑) 2017/03/18(土) 12:24

 マクロなら普通にループですれば良いのに、マクロでIndexを使う前提で質問する意味が分かりません。
 test1の方が分かりやすいと思います。
 test2はγさんと同じアプローチです。

 Sub test1()
    Dim i As Long
    Dim k As Integer
    Dim m As Long

    For k = 8 To 44 Step 3
        For i = 14 To 62 Step 2
            m = m + 1
            Sheets("Sheet2").Cells(i, k).Value = Right(Sheets("Sheet1").Cells(m, "A").Value, 5)
        Next i
    Next k

 End Sub

 Sub test2()
    Dim i As Long

    For i = 1 To 300
        Sheets("Sheet2").Cells(((i - 1) Mod 25) * 2 + 14, Int((i - 1) / 25) * 3 + 8).Value _
                = Right(Sheets("Sheet1").Cells(i, "A").Value, 5)
    Next i

 End Sub

 関数ならこんなので、

 H14 =RIGHT(INDEX(Sheet1!$A:$A,(ROW(A1)+1)/2+INT(COLUMN(A1)/3)*25),5)
 H14:J15まで選択して、下右にフィルコピー

(sy) 2017/03/18(土) 12:34


 完成できました。いつものことですが、(sy)さん・ (γ)さん方はいつもお世話になっています。その他にも(笑)さん等、色々な方々にお教え頂き感謝しています。事務処理が間違いが少なく遂行出来て、有り難いかぎりです。お礼が遅くなりました、すみません。「だっこにおんぶ」というような状態が続くことは、自分でもよくないと思っていますが、申し訳ありません。今後ともよろしくお願いします。
(ウルトラ) 2017/03/21(火) 11:19

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.