• 締切済み

VBAでのデータ転記

データがsheet1に縦記述で書いてあります。 A01 A02 A03 . . B01 B02 B03 . . AA01 AA02 AA03 . . AB01 AB02 AB03 . . これをsheet2に以下のように並べ替えたいのです。 A01 A02 A03・・・ B01 B02 B03・・・ ・・・・・ AA01 AA02 AA03・・・ AB01 AB02 AB03・・・ Left関数で文字列の左1文字を前後のセルで比較して異なる場合、改行する方法を考えましたが、AA01 AA02・・・になると左から2番目の文字で判断しなければなりません。なにかいい方法はあるでしょうか? ご指導宜しくお願いいたします。

みんなの回答

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんばんは。 コードを見せていただいたほうがいいと思いますが、このマクロは、いつも書いている人でないと、なかなかできないような気がしますね。今回、いつも使わないオーソドックスなパターンを使っています。 以下は、データがすでに、並び替えが済んでいるものとします。 アクティブシートから、設定したシートに吐き出します。 '<標準モジュールの登録> Option Explicit Sub testSample()  Dim Rng As Range  Dim CopySh As Worksheet  Dim rw As Long  Dim i As Long, j As Long, r As String  Dim r1 As Long, r2 As Long  Dim shCount As Integer  Dim myCol As Integer  'ユーザー設定  '=======================================  Set CopySh = Worksheets("Sheet2")  rw = 1 'コピー先の最初の書き出し行  '=======================================  Application.ScreenUpdating = False  With Range("A1", Range("A1").End(xlDown))   i = 1: j = 1   Do    Do     r = SearchMoji(.Cells(j, 1).Value)     j = j + 1    Loop While r = SearchMoji(.Cells(j, 1).Value)    r1 = i    r2 = j - 1    'コピー処理    Range(.Cells(r1, myCol), .Cells(r2, myCol)).Copy    CopySh.Cells(rw, 1).PasteSpecial , Transpose:=True    rw = rw + 1    i = j    j = j   Loop Until i > .Rows.Count  End With  Application.CutCopyMode = True  Application.ScreenUpdating = True  Set CopySh = Nothing  MsgBox "終了!" End Sub Private Function SearchMoji(arg1 As String) Dim myStr As String, i As Integer myStr = Application.Substitute(arg1, Space(1), "") For i = Len(myStr) To 1 Step -1   If IsNumeric(Mid(myStr, i, 1)) = False Then    Exit For   End If Next i If i = 0 Then  SearchMoji = myStr Else  SearchMoji = Mid$(myStr, 1, i) End If End Function

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

後ろの説明に書いてあるようにできるのでしたら、A01~Z99までの先頭に文字の合成でなにかわかりやすい1文字(たとえば@など)を付け加えて文字数を2文字に直して、left関数で2文字を切り出して比較してはどうでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • VBAでのデータ転記(再)

    データがsheet1に縦記述で書いてあります。 C列 D列 ああ A01 いい A02 うう A03 . ささ B01 しし B02 すす B03 . はは AA01 ひひ AA02 ふふ AA03 . やや AB01 ゆゆ AB02 よよ AB03 . D列を元にしてC列の文字列をsheet2に以下のように並べたいです。D列はアドレス扱いででアルファベットが変わったら改行してデータを並べるようにします。 A列  B列 C列 ああ いい うう・ ささ しし すす・ ・・・・・ はは ひひ ふふ・ やや ゆゆ よよ・ 作成したコード Dim I As Integer, MAE As String, IMA As String, TEMP2 As String Dim X1 As Integer, Y1 As Integer, X3 As Integer, Y3 As Integer, PINNAME As String X1 = 4: Y1 = 2 X3 = 1: Y3 = 1 MAE = Sheets("Sheet1").Cells(Y1, X1) Do PINNAME = Sheets("Sheet1").Cells(Y1, X1 - 1) IMA = Sheets("Sheet1").Cells(Y1, X1) '今の値が入っている If IMA = "" Then Exit Do End If If Left(MAE, 1) <> Left(IMA, 1) Then Y3 = Y3 + 1: X3 = 1 Sheets("Sheet2").Cells(Y3, X3).Value = PINNAME X3 = X3 + 1 Else Sheets("Sheet2").Cells(Y3, X3).Value = PINNAME X3 = X3 + 1 End If MAE = Sheets("Sheet1").Cells(Y1, X1) Y1 = Y1 + 1 Loop Until IMA = "" Left関数でアドレスの左1文字を前後のセルで比較して異なる場合、改行する方法を考えましたが、AA01 AA02・・・がムリです。このコードに補足すればできるでしょうか?それとも別の考え方で行った方がいいでしょうか? 初心者レベルなので考え方も教えて下さい。宜しくお願いします。

  • vbaにて並べ替えしたい。

    並べ替えするには? ただいまVBA学習中です。 sheet1に次のような文字列がセルに入力されているとします。 3列で30行あります。   A列 B列 C列 1行 あ  い  う 2行 え  お  か ...以下30行まで続く。 これらを sheet2に A列 あ い う え お か のようにひとつの列へ縦にするにはどのような記述になりますか? 私なりの考え方ですが セルのスタート位置はシート1のA1とします。  シート1にて  ・あ い う と順番に配列に格納  ・セルを左に2つ下に1つ移動   この動作を30回繰り返す(for next 使えばでいいですよね?)  シート2に移動してA1から下方向へ  格納された文字列を入力する。  と、考えてみたものの記述の仕方がわかりません。 力貸してください。   

  • エクセル 行数指定し一つのセルに改行込で入れる

    日本語が下手でもうしわけないです。 エクセルのマクロにて、行数指定指定したセルを別セルに 改行を含めて入れたいのです。 具体的なやりたいこととしては、 A列に不定期間隔で不定形の文字列が入力されていて、(間は空白) その文字列から文字列の行数を読み、 B列の同じ行数分のセルをひとまとまりとし、 別シートのA1に改行込みで入れる。 次のまとまりはA2に次はA3に… といった動作をさせたいです。 例. 1.A1,A6,A9に文字列があるとする。間は空白 文字列間の行数を読む (1)A1-A5 (2)A6-A8 (3)A9-最終行 2.A列で取得した行数と同じ行数をB列で指定 (1)B1-B5 (2)B6-B8 (3)B9-最終行 3.B列で指定したセルをひとまとまりとして 別シートのA1から順に改行込みで入れる (1)シート2のA1 B1(改行) B2(改行) B3(改行) B4(改行) B5(改行) (2)シート2のA2 B6(改行) B7(改行) B8(改行) (3)シート2のA3 B9(改行) ・ ・ 最終行 ####### マクロでの実現を考えているのですが、 マクロ初心者でさっぱりわかりません。 どなたか、マクロでの記述例を教えて頂けないでしょうか。 また、関数で実現できるのであれば、そちらも教えて頂きたいです。 宜しくお願いします。

  • エクセルのセル内数字の分割転記

    またしてもド素人の質問で恐縮ですが、 ある列に桁数の異なる数値が縦に並んで記載されているとき、 セルと同一列の別のセルに、数値を一文字ずつ分割して、下記の様に表示させたいのです。 (G列の数字はすべて右揃えのつもりです)   A B C D E F G 1  5 4 3 2 1   54321 2      1 2 3    123 3        2 2     22 4      6 5 2    652 5          9     9 そこで、A1には、=LEFT(RIGHT($G1,5))、B1には=LEFT(RIGHT($G1,4))、というように、関数を入れておき、1列目はA1からE1まで無事表示できました。 しかし、2列目以降にA1からE1の各セルの式を転記しますと、 1  5 4 3 2 1    54321 2  1 1 1 2 3     123 3  2 2 2 2 2      22 4  6 6 6 5 2     652 5  9 9 9 9 9       9 と、なってしまいました。空白にしたいところに指定セルのトップの数字が入ってしまうんです。指定したセルの数字の桁数よりも大きな部分は空白にしたいのですが、 「もしも何かの条件に合わねば空欄に」というようなことができれば幸いなんですが、どのようにすればいいのかをお教えください。

  • エクセルの名前の定義について。

    ご覧いただきありがとうございます。 エクセルの名前の定義についての質問です。 (1)【sheet1】 A2:A6に『aa』、 B2:B10に『bb』、 C2:C6に『cc』という名前を付けたとします。 ちなみにそれぞれのセルには文字列が入力されています。 (名前の定義の《範囲》はブックではなく、sheet1) (2)【sheet2】 B2:D6に『aa』、 B7:D15に『bb』、 B16:D20に『cc』と、sheet1と同じ名前を付けました。 それぞれB列・C列・D列には数字が入力されています。 (名前の定義の《範囲》はブックではなく、sheet2) ちなみにA列には、sheet1に入力されている文字列と同じものが入力されています。 A2:A6にはsheet1で『aa』と名前をつけた範囲と同じ文字列。 A7:A15にはsheet1の『bb』と同じ文字列。 A16:A20には『cc』と同じ文字列です。 ここからが本題です! (3)【sheet3】 A2に何らかしら関数を入れて、【sheet1】で作った名前(aaやbbやcc)が1つ表示されるようにしたとします。 そしてB2には、A2で表示された名前の中の文字列が1つ表示されるようにします。 (例えばA2に『aa』と表示されたら、B2には◯◯) 更にC2には、B2に表示された◯◯という文字列を使って、【sheet2】の名前『aa』の中のB列と、A列にある◯◯とが交差するセルに入力されている数字(図でいう(5))を表示させる関数を入力したいのです。(INDEXやINDIRECT、MATCH関数など…) 他に例えば、A2に『bb』(sheet1の名前)、B2に★★と表示されたら、C2には【sheet2】の名前『bb』の中のB列と、A列にある★★が交差するセルに入力されている数字を表示させたいです。 同じように、今度は、D2には、B2に表示された◯◯という文字列を使って、【sheet2】の名前『aa』のC列と、A列にある◯◯の交差するセルに入力されている数字を表示させたいです。 長々とややこしくてすみません… 説明分かりますでしょうか?? つまりは【sheet3】のC2・D2・E2に入力する関数が知りたいです。 自分なりに関数を入力してみたのですが、A2で表示された名前がsheet1での名前なので、sheet2の情報を引き出す事が出来ません。 わざわざsheet1とsheet2でシートを分けたのは、同じシート内で同じ名前が付けられないと思ったからです! どなたか分かりましたら教えて下さい! どうぞよろしくお願い致します。 ※ちなみに、貼付した図の『・』は以下省略の意味で使ってます。

  • リストからデータを紐付けしたい

    エクセルで別シートのリストからデータを紐付けするには、 どのようにすればよろしいでしょうか? 関数でもVBAでも良いので教えてください。 リストのA列、B列に文字列が記入してあります。 Sheet1のB列の文字列を検索値として、 リストのA列の文字列と部分一致するものの横の列(B列)の値を Sheet1のC列に紐付けしたいのですが、どのようにすればよろしいでしょうか? ※リストの「1AA111」という文字列とSheet1の「1AA111-G」という文字列の場合    「1AA111」の箇所で紐付けしたい(図を参照下さい) エクセルは2007,2010を使用しております。 よろしくお願い致します。

  • CLEAN関数マクロ記述式!

    エクセルで、(例えば)A列のセル内改行されたデータを「CLEAN関数」でB列に表示させたい時、A列に入っている分のデータだけを隣のB列に表示させる場合のマクロの記述式を教えて下さい。セルA1「あああ 改行 いいい」→B1「あああいいい」、セルA2「ううう 改行 えええ」→B2「うううえええ」、セルA3「データなし」→B3「表示なし」  イメージご理解して頂けたでしょうか?要するにA列に入ってるセルのデータのみをCLEAN関数でB列に表示させ、A列に入ってない場合はCLEAN関数を適用しない場合の記述式です。どうか宜しくお願いします。

  • 平均値を出すVBAを教えて下さい!

    平均値を出すVBAを教えてください!! 下記の関数をCA2に入れて下に引っ張って使っているのですが、 データ量が多すぎて砂時計状態のまま動きません!! データはA列~BVまでで50万行位あります。 一番上は見出しです。 VBAで関数を使わないで平均値を出す方法を教えてください!! C列に日付が記入されており、シート11のセルで期間を以上と以下で設定しています。 答えが一緒であればどんな方法でも構いません。 ぜひよろしくお願いします。 =AVERAGEIFS(AC:AC,A:A,A10,C:C,Sheet11!$A$1,C:C,Sheet11!$B$1,AB:AB,2)

  • Excelセル内の改行を含む文字列の1行目抽出

    Excelセル内の改行を含む文字列があり、関数を使って、その1行目だけ抽出したい。 たとえば、下記のような式を書きました。「改行コード」おかしみたいで動作しません。 Left("A1", Find(vbCrLf, "A1")) (改行コードをさがして、そこまでの文字列を切り取る) これをVBAで書く方法があれば、コードを教えてください!

  • エクセルの関数について

    下記のようなことが関数で出来ますか? A1セルに「AA AB AC AD AE」というデータがあったときに、 B1に、A1に「AB」か「AC」という文字列があればそれを取り出す。なければブランク(もしくは#N/A) かつ優先順位もつけたい。 (「AB」も「AC」もある場合は「AB」) 「AA」と「AB」の間など、文字間は必ず半角スペースがあいている状態です。 具体的な例は↓の画像のような感じです。 かなり高度だと思うんですが、関数で実現できますでしょうか? よろしくお願いします。

専門家に質問してみよう