別のシートに特定の文字だけ転送する方法

このQ&Aのポイント
  • エクセルファイルで特定の文字だけを抽出し、別のシートに転送する方法を知りたいです。
  • シート「No.1」の特定のセルからXとTの文字だけを抽出して、シート「No.2」に転送する方法を教えてください。
  • エクセルのVBAや計算式を使用して、特定の文字だけを抽出して別のシートに転送する方法を教えてください。
回答を見る
  • ベストアンサー

別のシートに特定の文字だけ転送する計算式やVBA

エクセルファイルのシート「No.1」のセルA1~A30に氏名が入力されて、セルB1~E30に氏名に振り分けられた文字が入力されています。 この文字には不定期にXとTの文字が入力されています。 そして、このシートに入力された氏名の順番や文字は毎月変更されます。 同じエクセルファイルのシート「No.2」のA1~A30には順番が変更されない氏名が入力されて、B1~E30は文字が何も入力されていない空白の状態です。 コマンドボタンを押すとシート「No.1」のA1~A30に入力された氏名に該当するB1~E30のXとTのみ抽出して、シート「No.2」のB1~E30にXとTの文字のみを張り付けるVBAやセルに入力する計算式はどの様に行えば良いでしょうか?

noname#247334
noname#247334

質問者が選んだベストアンサー

  • ベストアンサー
  • emaxemax
  • ベストアンサー率35% (43/121)
回答No.3

1行変えるだけで対応できますよ。こんな感じ。 Sub TEST20210418() Dim myV, myW Dim i As Long, n As Long, j As Long myW = Sheets("No.1").Range("A1:E30").Value Sheets("No.2").Range("B1:E30").ClearContents myV = Sheets("No.2").Range("A1:E30").Value For i = 1 To 30 For n = 1 To 30 If myV(i, 1) = myW(n, 1) Then For j = 2 To 5 If myW(n, j) = "X" Or myW(n, j) = "T" Then myV(i, j) = IIf(myW(n, j) = "X", "-", "休") End If Next j Exit For End If Next n Next i Sheets("No.2").Range("A1:E30").Value = myV End Sub

noname#247334
質問者

お礼

ありがとうございました。 VBAを作成する際の参考になりました。

その他の回答 (2)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

この問題は小生は、梃子づった。下記方法よりも、 単純にSheet1のデータのある範囲の全セルを、舐める方法がよいのかも。 ーー 関数では複雑になりそうに思う。VBAしかないのかも。 ーー 質問の標題の、>「転送する」は、適当でないように思う。 作業内容は、表のデータの抜出と組換えに当たる。 ーー XやTのあるセルを見つける必要があるので、 VBAのFindを使う方法をやってみた。 ・Findの利用は初心者にはむつかしいと思う。 ・小生が、質問の内容を誤解していた場合でも、質問者にはVBAの修正の技量はないのだろう。  特に,シート「No.2」Sのデータ結果の、データ例さえ挙げずに質問するもんだから、 推測でやらざるを得なかった。 質問者のためには、あまり役立たないかも。 ・小生は結構、梃子づった。満足してないが、趣味でやってみたことを、参考までに上げるしかない。 === 基データは「Sheet1」にある、とする。 結果は「Sheet2」に出すとする。 ーー 前提 Sheet2には、名前データだけ既に作られていて、A列にあり、好みの順に、行的に氏名は並んでいるとする。 データ例 Sheet1 A2:E11 山田 - X X - 大倉 - - - T 矢野 T X T 大野 - X - X 近藤 - T - - 佐藤 - - - X 今野 X - - - 木下 X T - T 熊野 T T - T 宮崎 - T X - Sheet2には、A2:A11に 大倉 熊野 矢野 木下 山田 宮崎 近藤 佐藤 大野 今野 と、この順で並んでいるとする。質問者が指定したと模す。 ーー 標準モジュールに Sub test02() fndmoji = "X" ’fndmoji = "T" strt: Set Rng = Worksheets("Sheet1").Range("b2:E11").Find(what:=fndmoji, LookAt:=xlWhole, SearchOrder:=xlByRows) If Not Rng Is Nothing Then MsgBox Worksheets("Sheet1").Cells(Rng.Row, "A") & "=" & Rng.Address GoSub dtset 'Sheetへセット firstAddress = Rng.Address Do ' 前回値が見つかったセルの次から検索 Set Rng = Worksheets("Sheet1").Range("b2:E11").FindNext(Rng) '2箇所目を探す If Rng Is Nothing Then GoTo DoneFinding '見つからなかったら処理終了 '---最初の位置へ戻ったら終了 If Rng.Address = firstAddress Then GoTo DoneFinding '---データをSheet2へセット GoSub dtset Loop While Rng.Address <> firstAddress End If '---調べつくした DoneFinding: GoTo owari '----------------------Sheet2へデータセット----------------- dtset: '----画面標示 MsgBox Worksheets("Sheet1").Cells(Rng.Row, "A") & "=" & Rng.Address '---見つかった時、名前を取得 Name = Worksheets("Sheet1").Cells(Rng.Row, "A") 'sheet1nのA列が名前 '--その名前の行を探す For k = 2 To 11 If Worksheets("Sheet2").Cells(k, "A") = Name Then '一番右のデータ列の次列を探す c = Worksheets("Sheet2").Cells(k, 1000).End(xlToLeft).Column + 1 '--Sheet2のセルへデータをセット Worksheets("Sheet2").Cells(k, c) = fndmoji & "-" & Rng.Address Exit For End If Next k Return '------------------------------------------- '---終了 owari: Set Rng = Nothing Set fndnm = Nothing End Sub まず上記で実行。 終了後にもう一度、初めの方の2行を下記に変えて実行。 'fndmoji = "X" fndmoji = "T" ーーー 結果 Sheet2のA2:D11に これは、XとTの後に見つかったアドレスをくっつけた。 (本当はどうすべきか質問文では分らず。) 大倉 T-$E$3 熊野 T-$B$10 T-$C$10 T-$E$10 矢野 X-$C$4 T-$B$4 T-$D$4 木下 X-$B$9 T-$C$9 T-$E$9 山田 X-$C$2 X-$D$2 宮崎 X-$D$11 T-$C$11 近藤 T-$C$6 佐藤 X-$E$7 大野 X-$C$5 X-$E$5 今野 X-$B$8 ーー 2度実行を1度実行で済ます方法について、Findを使うがために、自信なくて。 最終行=データ量は第11行でやっているが、データの多寡で、11を実態の最終行番号に置き換えるのは(VBA1行)たやすい。2箇所要修正。

noname#247334
質問者

お礼

ありがとうございました。 参考にVBAを組み立てていきたいと思います。

  • emaxemax
  • ベストアンサー率35% (43/121)
回答No.1

これでいかがでしょう? Sub TEST20210417() Dim myV, myW Dim i As Long, n As Long, j As Long myW = Sheets("No.1").Range("A1:E30").Value Sheets("No.2").Range("B1:E30").ClearContents myV = Sheets("No.2").Range("A1:E30").Value For i = 1 To 30 For n = 1 To 30 If myV(i, 1) = myW(n, 1) Then For j = 2 To 5 If myW(n, j) = "X" Or myW(n, j) = "T" Then myV(i, j) = myW(n, j) End If Next j Exit For End If Next n Next i Sheets("No.2").Range("A1:E30").Value = myV End Sub

noname#247334
質問者

お礼

ありがとうございました。 VBAを作成する際の参考になりました。

noname#247334
質問者

補足

①XとTの文字を抽出して、Xの文字は「-」でTの文字の所は「休」にする場合はどう追加すれば良いですか?

関連するQ&A

  • VBA 別シートの計算表

    Excelについて。 シートAに、計算表があります。 セルa1に入力した値によって、いくつかのExcel関数を利用して、 セルb1に結果を出力しています。 いつも、手入力でセルa1に値を入力して結果を求めていますが。 今度、シートBに膨大な入力するための数値があるので、VBAで自動化できないかと考えています。 今回の質問は、VBAで記述する際に、シートAの入力セルa1に、シートBの入力値を1つずつ代入していき、結果のセルb1をシートBの入力値の隣に出力していこうと考えています。 シートAのa1に入力値を代入して、すぐに結果b1の値を結果出力セルに代入していいのでしょうか? 計算表(シートA)での計算を時間をおく必要があるのでしょうか?=一旦、他のセルを選択するなど。 よろしくお願いします。 ・計算表での計算時間は、1秒未満です。 ・計算表の計算過程もVBAで書けば済む話ですが、プログラミングには疎いので、計算表をそのまま利用したいと考えています。=入力の代入だけVBAで書いていきたいと思います。 ・その他、アドバイスなどいただければ幸いです。 よろしくお願いします。 Excel2010

  • VBA 異なるファイルを指定して文字を抜き出す

    エクセルVBAについてご質問させて頂きます。 お詳しい方、ご教授頂ければ幸いです。 ファイルAを展開中に、別ファイルであるファイルB(ユーザ指定)の特定シートのセル「D2」及び「E2」から下のデータを順番に参照し、条件に合致する列のセル「B2」及び「C2」の文字列を繋げて改行し、 ファイルAの特定シートのセル「E2」から下に順番に貼り付けて行くには、 どのようにすれば良いでしょうか。 例   条件: D2=さ E2=た        ・ファイルB(指定) 特定シート        A    B    C    D    E    1    2   0    あ    か    さ    た    3   0    あ    き    さ    た    4   0    い    か    さ    ち    5   0    い    き    さ    た    6   0    う    か    し    た    7   0    え    か    し    ち    8   0    え    か    し    た    ・ファイルA特定シート       A    B    C    D    E    1                            2                      あ                           か    3                      あ                           き    4                      い                           き  実力不足で丸投げの形となってしまい申し訳ありませんが、 よろしくお願い致します。    

  • VBAを使い、同一フォルダにあるファイルの特定のシートの情報を取得したい

    はじめまして。 書籍や過去の質問等を調べましたが、類似するものを見つけられなかったため質問させていただきます。 Xというエクセルファイルで、Xと同一フォルダ内にある、ファイル名に特定の文字列(例えば「月報」)を含んだ全てのエクセルファイルの、特定の文字列(例えば「○年○月」)を含んだ全シートの、一定のセル範囲をひとつのシートにまとめたいと思っています。 X内のコマンドボタンで動かす予定ですが、複数のボタンになると自分では思っています(ボタンAでファイル名の取得、ボタンBでシートの取得、ボタンCでセルに貼り付け、みたいな感じで。ボタンの数は特に制限はないです) 要点としては a, 定定の文字列を含んだファイル名の取得 b, aで取得したファイル内の特定の文字列を含んだ全てのシート内の一定のセル範囲の取得(シートの数はファイルによる。必ずしも1つというわけではない。) c. bで取得した一定のセル範囲のデータを、1つのシートにまとめる。 あとはこれらのデータをtxtやcsvなどに出力できるようにするつもりです。 私がやってできたのは、同一フォルダ内にあるファイル名に特定の文字列を含むファイルの全てのファイル名を指定したセルに吐き出すことしかできませんでした。 なんか、ややこしい表現かもしれませんが、ご指導お願いします。 環境はxp、エクセル2003です。 よろしくお願いします。

  • 別シートへ飛ばす

    エクセルの関数またはマクロでどうしたらできるのでしょうか? 内容ですが、元データはsheet1にA4に整理番号があり、B4に識別番号があり、C4に名前があり、D4にフリガナがあり、E4に区分があります。 ここでE4セルにある数種類(1~6)の区分から、1と2であれば、その左のセルの情報A4B4C4D4がsheet2のA4~E4へ上から順番に埋まっていくように飛ばすにはどうしたらいいでしょうか? たくさん羅列してあるデータから条件を満たしている人が別シートの上から順に埋めていきたいのです。 宜しくお願いします。

  • エクセル VBA 特定文字がある行を別シートに移動

    C列にA,B,C,D,E(赤枠部分)の文字列が入力された表があります。 マクロ実行時下記のようにするには、VBAのコードをどのように記入すれば、よろしいでしょうか? AとBが入力されている行をシート2にコピー Cが入力されている行を切り取りしシート2に貼り付け(下の行は上方向にシフト) Dが入力されている行を切り取りしシート3に貼り付け(下の行は上方向にシフト) Eが入力されている行を切り取りしシート3に貼り付け(下の行は上方向にシフト) エクセルは2000及び2007です。 よろしくお願い致します。

  • EXCEL VBAで別のシートに値を渡したいのですが・・・

    まず 例えば3行2列のセルに |A|10| |B|20| |C|30| というような値があるとします。 アルファベットにはそれぞれ次のような意味があり、 A=山 B=川 C=海 このデータを元に 別シート(山、川、海の3シート)に 山シート |NO.|10| 川シート |NO.|20| 海シート |NO.|30| と 1行2列のセルに値を渡したいのですが、 そういうことはエクセルで可能でしょうか? エクセルに詳しい方、どうぞご教授ください。 よろしくお願い致します。

  • 別シートへ飛ばす2

    エクセルの関数またはマクロでどうしたらできるのでしょうか? 内容ですが、元データはsheet1にA4に整理番号があり、B4に識別番号があり、C4に名前があり、D4にフリガナがあり、E4に区分があります。 ここでE4セルの区分ですが、種類が(要支援1、要支援2、要介護1~5)あり、要支援1、要支援2であれば、その左のセルの情報A4B4C4D4がsheet2のA4~E4へ上から順番に埋まっていくように飛ばすにはどうしたらいいでしょうか? たくさん羅列してあるデータから条件を満たしている人が別シートの上から順に埋めていきたいのです。 宜しくお願いします。

  • EXCEL VBA 別シートの文字をシート内で検索

    excel2003 VBAで SHEET2に格納されているセルの文字をSHEET1のB列1~9000程度までの文字列の中で一致または部分一致するものがあればそのセル(B列のセル)をSHEET3に順次A列に出力したいのですが、うまくできません。SHEET2に格納されている場所はA列で(SHEET1、SHEET2の文字とも増える可能性あり) 宜しくお願いします。

  • EXCEL◆入力した文字列を別シートへ自動でコピー

    エクセルについてです。 例えば、Sheet1のA1セルに「みかん」と入力した時に、自動的にSheet2のA1セルにも同じく「みかん」という文字がコピーされるようにしたいです。 この場合、Sheet2のA1セルに 「=Sheet1!A1」 と入力すればコピーされるのは知っているのですが、これだとSheet1のA1セルに何の文字も入力されていない場合、Sheet2のA1セルに「0」と表示されてしまいます。 Sheet1のA1セルに何も入力されていない場合、Sheet2のA1セルにも同じく何も表示されない方法を教えて頂けませんでしょうか? 以前会社のエクセルファイルでそのような関数が入力されており、多分VLOOKUP関数が使われていたように思うのですが、そのファイルがなくなってしまった為、確認が出来なくなってしまいました。 こういったシートを作る目的としては、Sheet2が印刷する為のシートなのですが、入力箇所が列も行もバラバラの為、いちいちそのセルをクリックして入力していると時間がかかる為、Sheet1を入力専用シートにしたいからです。 自分なりに調べてみましたが、似たような質問が見当たりませんでした。

  • 別シートのセルの文字をシート名に自動で変更

    いつもありがとうございます。 下記の添付の「勤務表」のシートのA4の日付を変更すれば、「Sheet1」のシート名も自動的に変換できるようにとネット検索で見つけてきた下記のマクロ(?)の記述をセル名を変えてコピペし、「勤務表」のシートのA4の日付を変えて見たのですが、何の変化もありません。エラーメッセージも出ません。 Private Sub Worksheet_Change(ByVal Target As Range) On Error GoTo ERR_HANDLER If Target.Address(False, False) = "勤務表!A4" Then ActiveSheet.Name = Range("勤務表!A4").Value End If Exit Sub ERR_HANDLER: MsgBox "現在のセルの値はシート名にできません。" End Sub 「勤務表」のシートのA4以下は、B1とE1の数値から自動で一ヶ月分の日付を入れる関数を入れて日付を作成しています。 =IF(DATE($B$1+1988,$E$1,ROW(A21))>DATE($B$1+1988,$E$1+1,20),"",DATE($B$1+1988,$E$1,ROW(A21))) 念のため、「Sheet1」内のA1でシート名が変わるかどうか試してますと、直接入力した文字の場合、シート名が入力した文字に問題なく変わりますが、関数で呼び込んだ文字は「現在のセルの値はシート名にできません。」のエラーメッセージが返って来ました。 このことから、関数で呼び込んだ文字では、シート名の自動変更はできないのが判りましたが、「勤務表」から呼び出した場合、エラーメッセージも出ないところを見ると、そのことの対処だけでは、解決しないような気がしています。 色々、ネットで検索したりもしましたが、未熟な私の知識と経験では、行き詰ってしまいました。 関数で呼び込んだ別シートのセルの日付で、シート名が自動で変更できるように、 お助け頂けないでしょうか? 当方はエクセル2010を使用しております。 よろしくお願いいたします。

専門家に質問してみよう