- ベストアンサー
セルの文字列を取り出して一つのセルに入れる方法
- VBA初心者の方が、年度別、都道府県別の地震の発生件数から特定の年度の地震が起こった都道府県を抽出して一つのセルにまとめる方法について質問されています。
- 例えば、1999年の地震が起こった都道府県を抽出するためにオートフィルタを使用する方法や、オートフィルタ後の行番号を参照して値を取得する方法について説明されています。
- もしオートフィルタ後の値が正しく取得できない場合は、各列に都道府県を一つずつ入れていく方法でも問題ありません。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
オートフィルタで抽出された行だけ対象にして処理する例です。ご参考まで。 連想配列向けの課題かもしれません。興味を持たれたら、VBA dictionaryでお調べ下さい。 Sub test() Debug.Print funcTest("1999年") End Sub Private Function funcTest(targetYear As String) As String Dim targetRange As Range Dim i As Long Dim prefNames As String With ActiveSheet Set targetRange = .Range(.Range("A1"), .Range("A" & .Rows.Count).End(xlUp)).Resize(, 3) End With With targetRange .AutoFilter Field:=1, Criteria1:=targetYear For i = 2 To .Rows.Count If .Cells(i, 1).EntireRow.Hidden = False Then If prefNames = "" Then prefNames = .Cells(i, 2).Value Else prefNames = prefNames & "," & .Cells(i, 2).Value End If End If Next .AutoFilter End With funcTest = prefNames End Function
その他の回答 (1)
- soixante
- ベストアンサー率32% (401/1245)
元データがどのようになっているのかわかりませんが、わたしでしたら以下のようにしてみます。 オートフィルタは使ってません。 ・データの入ってるシートがSheet1、まとめるシートがSheet2 とします。 ・Sheet1 の A列が発生年、 B列が都道府県名 とします。 ・Sheet2 の A列が発生年、 B列以降、右に都道府県名としています。(ひとつづつデータを入れる) 元データを上から順に、ひとつづつ、まとめシートの該当年のところにデータを飛ばしていきます。 Sub EarthquakeData() Dim r As Integer Dim Ws1 As Worksheet, Ws2 As Worksheet Dim Nen As Integer, Ken As String Dim NenRow As Integer, NenCol As Integer Set Ws1 = Worksheets(1) Set Ws2 = Worksheets(2) r = 2 Do While Ws1.Cells(r, 1) <> "" Nen = Ws1.Cells(r, 1).Value Ken = Ws1.Cells(r, 2).Value NenRow = Application.WorksheetFunction.Match(Nen, Ws2.Columns(1), 0) NenCol = Ws2.Cells(NenRow, Columns.Count).End(xlToLeft).Column + 1 Ws2.Cells(NenRow, NenCol).Value = Ken r = r + 1 Loop Set Ws1 = Nothing Set Ws2 = Nothing End Sub どうしても県名をひとつのセルに入れたいなら、この振り分け後のものを処理していただくだけです。
お礼
遅れて申し訳ございません。 ご回答ありがとうございます。 説明不足でしたが、 横方向に年度、縦方向に都道府県で、 それぞれの年度に何件発生したかというような形態でした。 たぶん、このやり方であればうまくいきそうですが、 データを組直さなければならないので・・・ 今回は「currentregion」と「resize」を使って うまくすることができました。 まだ初心者なのでいろいろな人のコードを見るのは興味深いですね。 Ws2.Cells(NenRow, Columns.Count).End(xlToLeft).Columnというところとか、 Match(Nen, Ws2.Columns(1), 0)とかどういう風に動くのか考えるだけで 勉強になりました。
お礼
遅れて申し訳ございません。 ご回答ありがとうございます。 まだ初心者なので、これはちょっとわかりませんでした・・・ また勉強してみます。 しかしmitarashiさんのコードで「resize」という関数があることを 知り、それと「currentregion」を組み合わせることでうまくすることができました。