
セルの文字列を取り出して一つのセルに入れる方法
こんにちは。
VBAの初心者のものです。
データ整理をしていたのですが、
次の様な場合、どのようにすればいいでしょうか。
例)
年度別、都道府県別の地震の発生件数のデータがあります。
これで1999年の地震が起こった都道府県を抽出するとします。
1999年の列でオートフィルタをかけ別のシートでまとめようと思います。
各年度でオートフィルタをかけて、次のようにまとめます。
1999年 北海道、宮城県、東京都
2000年 新潟県、静岡県、岡山県、石川県
2001年 福島県、宮城県、千葉県
2002年 愛知県、三重県、京都府
なお、都道府県のところはできれば一つのセルにいれたいと考えています。
1999年の場合なら
Range("").value=北海道のセル&"、"& 宮城県のセル &"、"&東京都のセル
各都道府県の行番号が
北海道「1」
宮城県「4」
東京都「13」
ならば、
range("").value = range("A1").value&"、"&range("A4").value&"、"&range("A13").value
というようになればいいのですが、
オートフィルタ後に行数をカウントし、次のようなコードにすると、
range("").value = range("A1").value&"、"&range("A2").value&"、"&range("A3").value
1999年 北海道、青森県、岩手県
となりオートフィルタ前の値が返されてしまいます。
このセルをどのように指定したらいいのかわかりません。
もしこれができないのであれば
各列に一つずつ(一つのセルに一つの都道府県)入れていく方法でも構いません。
1999年 北海道 宮城県 東京都
というような感じです。
よろしくお願いします。
No.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
参考URL:http://okwave.jp/qa/q5694462.html
遅れて申し訳ございません。
ご回答ありがとうございます。
まだ初心者なので、これはちょっとわかりませんでした・・・
また勉強してみます。
しかしmitarashiさんのコードで「resize」という関数があることを
知り、それと「currentregion」を組み合わせることでうまくすることができました。
No.1
- 回答日時:
元データがどのようになっているのかわかりませんが、わたしでしたら以下のようにしてみます。
オートフィルタは使ってません。
・データの入ってるシートが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)とかどういう風に動くのか考えるだけで
勉強になりました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
=SUBTOTAL に =COUNTIF の機能...
-
エクセルオートフィルタで余計...
-
行番号の文字の色が青色の理由?
-
Excel関数、何がいけないのかわ...
-
教えて下さい!関数SUBTOTALとC...
-
エクセルで、桁数の異なるデー...
-
エクセルの計算表の下向き三角...
-
オートフィルタで抽出したデー...
-
色フィルターをかけた状態で、...
-
VBA 表の1つ下のセルを選択する
-
オートフィルタをかけた表に一...
-
photoshopでフィルタを部分的に...
-
エクセル 最新データのみを表...
-
Excelでオートフィルタ時に交互...
-
excelで奇数の行のみ削除したい
-
EXCELで、空白セルを除いて別シ...
-
エクセル:色の付いたデータを...
-
エクセルの並べ替えでタイトル...
-
エクセルのフィルタをかけると...
-
多段のLCフィルタに関する質問
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
=SUBTOTAL に =COUNTIF の機能...
-
エクセルオートフィルタで余計...
-
Excel関数、何がいけないのかわ...
-
色フィルターをかけた状態で、...
-
行番号の文字の色が青色の理由?
-
教えて下さい!関数SUBTOTALとC...
-
オートフィルタで抽出したデー...
-
エクセルの計算表の下向き三角...
-
エクセルで、桁数の異なるデー...
-
エクセルのフィルタをかけると...
-
Excel VBAでフィルタしたものに...
-
オートフィルタをかけた表に一...
-
excelで奇数の行のみ削除したい
-
Excelでオートフィルタ時に交互...
-
色のついたセルにフラグを立た...
-
Excel VBAでオートフィルタで抽...
-
オートフィルタの使用にチェッ...
-
関数で可視セルのデータ個数カ...
-
Excelのセルのデータ:年...
-
5の倍数の日付だけを抽出したい
おすすめ情報