- ベストアンサー
別のシートに特定の文字だけ転送する方法
- エクセルファイルで特定の文字だけを抽出し、別のシートに転送する方法を知りたいです。
- シート「No.1」の特定のセルからXとTの文字だけを抽出して、シート「No.2」に転送する方法を教えてください。
- エクセルのVBAや計算式を使用して、特定の文字だけを抽出して別のシートに転送する方法を教えてください。
- みんなの回答 (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
その他の回答 (2)
- imogasi
- ベストアンサー率27% (4737/17070)
この問題は小生は、梃子づった。下記方法よりも、 単純に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箇所要修正。
お礼
ありがとうございました。 参考にVBAを組み立てていきたいと思います。
- emaxemax
- ベストアンサー率35% (44/124)
これでいかがでしょう? 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
お礼
ありがとうございました。 VBAを作成する際の参考になりました。
補足
①XとTの文字を抽出して、Xの文字は「-」でTの文字の所は「休」にする場合はどう追加すれば良いですか?
お礼
ありがとうございました。 VBAを作成する際の参考になりました。