[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『X1の人だけ別シートb列に隙間なく詰める』(八家)
〜sheet1〜
A B C 1 X1 芹沢鴨 2 X1 近藤勇 3 X5 新見錦 4 X4 斎藤一 5 X6 土方歳三 6 X5 大野右仲 7 X4 相馬主計 8 X1 山南敬助 9 X1 伊東甲子太郎 10 X6 沖田総司
〜sheet2〜
A B C 1 2 3
いつもお世話になっております。
質問したく投稿しました。
上記のようなシートが2枚あるとします。
ボタンを押したら、X1と振り分けられた人物だけsheet2のb列に隙間なく詰めるマクロを考えています。
一応、できたのですが、
:::::::::::::
〜sheet2〜
A B C 1 X1 芹沢鴨 2 X1 近藤勇 3 4 5 6 7 8 X1 山南敬助 9 X1 伊東甲子太郎 10 ::::::::::::: このように歯抜けになってしまいました。
以下、コード。
::::::::::::::::::::::::::::::::::::::
:::::::::::::::::::::::::::::::::::::
Sub 抜き取り()
Dim lastRow As Long, i As Long
Dim c0 As Worksheet, c1 As Worksheet
Set c0 = Sheets("Sheet1")
Set c1 = Sheets("c1")
For i = 1 To 100
If c0.Cells(i + 1, 1).Value = "X1" Then
c1.Cells(i, 2).Value = c0.Cells(i + 1, 2).Value
End If
Next i
End Sub
::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::
最終行を拾うというコードを拝借して、もう一度つくりなおしましたが・・・
:::::::::::::
〜sheet2〜
A B C 1 X1 芹沢鴨 2 X1 伊東甲子太郎 :::::::::::::
このように、歯抜けはなくなりましたが、頭と尻だけしか拾えない結果になってしまいました。
以下、コード。
::::::::::::::::::::::::::::::::::::::
:::::::::::::::::::::::::::::::::::::
Sub 抜き取り()
Dim lastRow As Long, i As Long
Dim c0 As Worksheet, c1 As Worksheet
Set c0 = Sheets("Sheet1")
Set c1 = Sheets("c1")
lastRow = c1.Cells(Rows.Count, 1).End(xlUp).Row
t = 0
For i = 1 To 100
If c0.Cells(i + 1, 1).Value = "X1" Then
c1.Cells(t + 1, 2).Value = c0.Cells(i + 1, 2).Value
End If
t = lastRow
Next i
End Sub
::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::
前置きが長くなりましたが、要は、歯抜けがなくなり、かつ、全てのデータが拾える
コードを作りたいのですが、どうしてもこれ以上は思いつきませんでした。
すいませんが、ご教授をお願いいたします。
< 使用 Excel:Excel2019、使用 OS:Windows10 >
t = 0
For i = 1 To 100
If c0.Cells(i + 1, 1).Value = "X1" Then
c1.Cells(t + 1, 2).Value = c0.Cells(i + 1, 2).Value
t = t + 1
End If
Next i
または
t = c1.Cells(Rows.Count, 1).End(xlUp).Row
For i = 1 To 100
If c0.Cells(i + 1, 1).Value = "X1" Then
c1.Cells(t + 1, 2).Value = c0.Cells(i + 1, 2).Value
End If
t = c1.Cells(Rows.Count, 1).End(xlUp).Row
Next i
もうすこしかえて
For i = 1 To 100
If c0.Cells(i + 1, 1).Value = "X1" Then
t = c1.Cells(Rows.Count, 1).End(xlUp).Row
c1.Cells(t + 1, 2).Value = c0.Cells(i + 1, 2).Value
End If
Next i
(さんぷる) 2022/12/03(土) 06:54:01
Sub ソート()
Dim ws1 As Worksheet, ws2 As Worksheet
Dim LastR As Long, cnt As Long
Set ws1 = Worksheets("Sheet1")
Set ws2 = Worksheets("Sheet2")
LastR = ws1.Cells(Rows.Count, 1).End(xlUp).Row
cnt = WorksheetFunction.CountIf(ws1.Range("A1").Resize(LastR), "X1")
ws1.Range("A1").Resize(LastR, 2).Sort Key1:=ws1.Range("A1"), Order1:=xlAscending
ws1.Range("A1").Resize(cnt, 2).Copy ws2.Range("A1")
End Sub
Sub オートフィルタ()
Dim ws1 As Worksheet, ws2 As Worksheet
Set ws1 = Worksheets("Sheet1")
Set ws2 = Worksheets("Sheet2")
With ws1
.Rows(1).Insert
.Range("A1") = "見出し"
.Range("A1").AutoFilter 1, "X1"
.Range("A1").CurrentRegion.Copy ws2.Range("A1")
.Rows(1).Delete
ws2.Rows(1).Delete
End With
End Sub
(フォーキー) 2022/12/03(土) 08:56:03
おはようございます
>このように歯抜けになってしまいました。
大丈夫!! 、皆やります。(笑)
>このように、歯抜けはなくなりましたが、頭と尻だけしか拾えない結果に >なってしまいました。
う〜ん、こっちはあまりしないな…きっと
八家さん...頑張ってVBAのお勉強をされているご様子で お手伝いにになるかわかりませんが
一応、できたのですが、の最初のマクロだと Sheet2に、下記のように転記され
|[A]|[B]
[1]| |近藤勇
[2]| |
[3]| |
[4]| |
[5]| |
[6]| |
[7]| |山南敬助
[8]| |伊東甲子太郎
最終行を拾うというコードを拝借して、もう一度つくりなおしましたが・・・ だと、Sheet2に、下記のように転記されるような気がしますけど
|[A]|[B]
[1]| |近藤勇
[2]| |伊東甲子太郎
マクロの一部を見ると i+1 にしてあるのは もしかして、1行目には見出しがあるってことですか?
↓ここ c0.Cells(i + 1, 2).Value
それと…少々気になる点ですが^^;
↓ここ…中途半端でww
Set c0 = Sheets("Sheet1")
Set c1 = Sheets("c1")
質問する時は、揃える
フォーキーさんのように統一
Set ws1 = Worksheets("Sheet1")
Set ws2 = Worksheets("Sheet2")
もしくは、シート名を変更したものに
Set c0 = Sheets("c0")
Set c1 = Sheets("c1")
もしくは、インデックスで揃えましょうよ Set c0 = Sheets(1) Set c1 = Sheets(2)
本題へ…見出しが1行目が無いとして 最初のマクロで、B列だけ転記するなら
Sub Sample1()
Dim lastRow As Long, i As Long, n As Long
Dim c0 As Worksheet, c1 As Worksheet
Set c0 = Sheets(1)
Set c1 = Sheets(2)
lastRow = c0.Cells(Rows.Count, 1).End(xlUp).Row
For i = 1 To lastRow
If c0.Cells(i, 1).Value = "X1" Then
n = n + 1
c1.Cells(n, 2).Value = c0.Cells(i, 2).Value
End If
Next i
End Sub
A列、B列の両方を、配列を使用してお引越し こちらの結果は、フォーキーさんが提案された 二つのマクロと同じになります。
Sub Sample2()
Dim c0 As Worksheet, c1 As Worksheet
Dim lastRow As Long
Dim i As Long, q As Long, n As Long
Dim storage() As Variant, extraction() As Variant
Set c0 = Sheets(1)
Set c1 = Sheets(2)
lastRow = c0.Cells(Rows.Count, 1).End(xlUp).Row
ReDim storage(lastRow, 2)
ReDim extraction(1 To lastRow, 1 To 2)
storage = c0.Range("A1:B" & lastRow).Value
n = 1
For i = 1 To UBound(storage, 1)
If storage(i, 1) = "X1" Then
For q = 1 To UBound(storage, 2)
extraction(n, q) = storage(i, q)
Next q
n = n + 1
End If
Next i
c1.Range("A1").Resize(n, UBound(extraction, 2)) = extraction
End Sub
(あみな) 2022/12/03(土) 11:05:54
(八家) 2022/12/03(土) 13:06:44
質問にも回答できないのですか? 上手く行くマクロと、上手く行かないマクロの場合とが あると思いますが....
(あみな) 2022/12/03(土) 15:06:23
> マクロの一部を見ると i+1 にしてあるのは
もしかして、1行目には見出しがあるってことですか? そうです。
>↓ここ…中途半端でww
Set c0 = Sheets("Sheet1")
Set c1 = Sheets("c1")
質問する時は、揃える
確かにそうですね、以後気を付けます。
>上手く行くマクロと、上手く行かないマクロの場合とが
あると思いますが.... 皆さんのマクロを勉強させてもらって頂きましたので大丈夫です。
ここまで親身になってくれたのに不躾な返答失礼しました。以後気を付けます。
(八家) 2022/12/03(土) 20:09:44
>質問する時は、揃える? (?) 2022/12/03(土) 20:32:37
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.