アプリ版:「スタンプのみでお礼する」機能のリリースについて

エクセルで下記のように氏名ごとに1行から複数行の行数が割り振られています。

 A      B    C
氏名  出発日  到着日

1佐藤  2/1      2/4
2佐藤  3/1      3/3
3佐藤  8/2       8/15
4小林  5/3       5/4
5田中  1/20      1/25
6田中   1/26     1/28
7田中   2/4      2/6
8田中   6/1      6/30
9田中   11/20    11/23
これらを3行には27行挿入、1行には29行を最後に挿入して必ずどこのかたまりも30行にする方法はありますでしょうか?
お分かりになる方、ご回答よろしくお願いいたします。

A 回答 (5件)

おおっ!



#4の方の
>元の日付の入ったデータはなくして、単に、名前だけのリストにします
この考え方、素晴らしいですね。
ただ、「日付の入ったデータ」をどこかに退避させておいて
後で復活するようにすれば完璧です。
この考え方、使えそうです。

なお、私の方はすでに私の考え方でコード作成に成功しています。
    • good
    • 0

ご質問では、表そのものを壊してよいようですから、元の日付の入ったデータはなくして、単に、名前だけのリストにします。

質問は、なるべく最初から詳しく正確にお願いします。特に、最初から熱心に書いくれた人が報われないのは、決して良いことではありません。

注意:消されたデータは元に戻りません。

'//
Sub Test1()
 Dim rng As Range
 Dim ar As Variant
 Dim i As Long, j As Long, k As Long
 'タイトル行があるかないか、区分け
 If Application.CountA(Range("A1:C1")) > 2 Then
   k = 2
 Else
   k = 1
 End If
 Set rng = Range(Cells(k, 1), Cells(Rows.Count, 1).End(xlUp)).Resize(, 3)
 ar = rng.Value
 Application.ScreenUpdating = False
 rng.EntireColumn.ClearContents
' rng.EntireColumn.Clear ''書式も消してしまうなら、こちらにする
 For i = 1 To UBound(ar, 1)
  If i = UBound(ar, 1) Then
   Cells(j * 30 + 1, 1).Resize(30).Value = ar(i, 1)
  ElseIf ar(i, 1) <> ar(i + 1, 1) Then
   Cells(j * 30 + 1, 1).Resize(30).Value = ar(i, 1)
   j = j + 1
  End If
 Next i
 Application.ScreenUpdating = True
 Set rng = Nothing
End Sub
    • good
    • 0

あれ? 1行目にはタイトル「氏名」「出発日」「到着日」が入っていませんでしたか?



1行目にはできるだけタイトル行を入れましょう。そうするとフィルタオプションが使えます。

とりあえず1つの考え方を示します。

Sheet2を作業用シートとして使い、フィルタオプションで重複のない名前データを取り出します。
そして、COUNTIF関数を埋め込み、それぞれの名前がいくつあるかをカウントします。
これが(作業用のシートを使うことが)気に入らないならDictionaryオブジェクトを使ってそれぞれの名前をカウントします。(以下にここまでをコード化してあります。意味を理解してください。)
その後は、Sheet1に1列目を挿入して作業列を確保し、名前の同じグループに連番を振っていきます。
(例.「佐藤」は1、「小林」は2、のように)
次に、データの最終行の続きから30に満たない数だけ、それぞれの番号を追加してゆきます。
最後に1列目で昇順ソートをかけます。
そして1列目を削除します。
以上でできあがるはずです。
マクロの記録をとってもらうと(記録できない操作もありそうだが)参考になるコードを得られます。

Option Explicit
Sub test()
Dim WS1 As Worksheet
Dim WS2 As Worksheet
Dim TargetRng As Range
Dim CountRng As Range

Set WS1 = Worksheets(1)
Set WS2 = Worksheets(2)
WS2.Cells.Clear
Set TargetRng = WS1.Range("A1").CurrentRegion.Columns(1)
TargetRng.AdvancedFilter Action:=xlFilterCopy, CopyToRange:=WS2.Range("A1"), Unique:=True

With WS2.Range("A1").CurrentRegion.Columns(1).Cells
.Resize(.Count - 1).Offset(1, 1).Formula = "=COUNTIF(" & TargetRng.Address(0, 0, xlA1, True) & ",A2)"
End With


End Sub
    • good
    • 0

A列のデータは本当に


「1佐藤」
「2佐藤」
とかなっているのでしょうか?
少なくともA列は連番、B列は名前 となっているべきです。

この回答への補足

回答ありがとうございます。
氏名の左の数字は行番号を表していました。
分かり辛く済みません。


 列 A    B      C


1 佐藤  2/1      2/4
2 佐藤  3/1      3/3
3 佐藤  8/2       8/15
4 小林  5/3       5/4
5 田中  1/20      1/25
6 田中   1/26     1/28
7 田中   2/4      2/6
8 田中   6/1      6/30
9 田中   11/20    11/23

      ↓
  列 A


1  佐藤
    ・
    ・
    ・
30  佐藤
31  小林
    ・ 
    ・
    ・
60  小林
61  田中
    ・
    ・
    ・
90  田中

このような形にしたいのですが…よろしくお願いいたします。

補足日時:2011/02/11 17:42
    • good
    • 0

こんにちは。



意味がわかりませんよ。
>3行には27行挿入、1行には29行を最後に挿入して
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!