Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


343 / 3841 ページ ←次へ | 前へ→

【75561】Re:マクロで、同じ番号行だけを残す方法
発言  ザ 焼鳥男  - 14/5/17(土) 21:22 -

引用なし
パスワード
   こんにちは、Excel VBA初心者です。よろしく御願いします。
ご回答が、御座いません。
多分、質問がごちゃごちしているためだと思いますので、修正します。

以下のマクロを教えて下さい。 
1、まずsheet1とsheet2がありsheet2を、新たに、新しいsheetにコピーして、タグ名を、「result」にします。
2、「result」のC列に、sheet1のB列(名前)をコピーします。
3、sheet1のA列とsheet2のB列の番号を、比較して、同じ番号だけを残します。
4、「result」のNoを、1から連番にします。
<<シート:sheet11>>
  A  B  C D
1  No. 名前 性別
2  A01 梅尾 女
3 A02 福田 男
4 B01 石川 女
5 B02 森田 男
<<シート:sheet2>>
 A B C  D E
1 タイトル(5セルを結合)
2 番号 No. 住所 年齢 得意科目
3  1 A01 東京 19歳 国語
4  2 A02 鹿児島 19歳 物理
5 3 A03 アメリカ 19歳 数学
6 4 A04 長野 19歳 数学
 <<シート:result>>
 A B C D E F
1 タイトル(6セルを結合)
2 番号 No. 名前 住所 年齢 得意科目
3 1 A01 梅尾 東京 19歳 国語
4 2 A02 福田 鹿児島 19歳 物理
・ツリー全体表示

【75560】Re:マクロで、同じ番号行だけを残す方法
回答  ザ 焼鳥男  - 14/5/17(土) 19:46 -

引用なし
パスワード
   松    1
竹    2
梅    3
犬    4
Sheet1

松    月    1
竹    火    2
木    水    3
金    日    4
        
Sheet2

松    月    1
竹    火    2
        
Result

この場合なら、前のコードでうまく処理できます。
・ツリー全体表示

【75559】Re:マクロで、同じ番号行だけを残す方法
発言  ザ 焼鳥男  - 14/5/17(土) 19:40 -

引用なし
パスワード
   よろしく御願い致します。

Sub macro1()
 Dim LastRow As Long
 LastRow = Worksheets("Sheet2").Cells(Rows.Count, 1).End(xlUp).Row

'結果シートを準備
 Worksheets("Sheet2").Copy after:=Worksheets("Sheet2")
 ActiveSheet.Name = "RESULT"

'ファイル1から転記、不要な行を抹消
 Range("C1:C" & LastRow).Formula = "=VLOOKUP(A1,Sheet1!A:B,2,FALSE)"
 On Error Resume Next
 Range("C1:C" & LastRow).SpecialCells(xlCellTypeFormulas, xlErrors).EntireRow.Delete
 Range("C1:C" & LastRow).Value = Range("C1:C" & LastRow).Value
End Sub
・ツリー全体表示

【75558】Re:マクロで、同じ番号行だけを残す方法
発言  ザ 焼鳥男  - 14/5/17(土) 19:39 -

引用なし
パスワード
   ▼カエムワセト さん:
>よくみたらラーメンから焼き鳥に乗り換えただけでしたか。

そうですが、、、
・ツリー全体表示

【75557】Re:マクロで、同じ番号行だけを残す方法
発言  カエムワセト  - 14/5/17(土) 18:03 -

引用なし
パスワード
   よくみたらラーメンから焼き鳥に乗り換えただけでしたか。
・ツリー全体表示

【75556】Re:マクロで、同じ番号行だけを残す方法
発言  カエムワセト  - 14/5/17(土) 18:01 -

引用なし
パスワード
   まず、こちらをお読みください。

VBA質問箱基本ポリシー

tp://www.vbalab.net/bbspolicy.html

>何をやったか書いてください

>してはいけない質問について
>・丸投げ
・ツリー全体表示

【75555】マクロで、同じ番号行だけを残す方法
質問  ザ 焼鳥男  - 14/5/17(土) 15:05 -

引用なし
パスワード
   こんにちは、
Excel VBA初心者です。よろしく御願いします。

以下のマクロを教えて下さい。 
1、まずsheet1とsheet2がありsheet2を、新たに、新しいsheetにコピーして、タグ名を、「result」にします。
sheet1は、2列以降に情報が入力、sheet2は、5列以降に情報が入力されています。
2、「result」のD列に、sheet1のB列(名前)をコピーします。
3、sheet1のA列とsheet2のB列の番号を、比較して、同じ番号だけを残します。
4、「result」のNoを、1から連番にします。

<<シート:sheet11>>
  A  B  C D
1  No. 名前 性別
2 A01 梅尾 女
3 A02 福田 男
4 B01 石川 女
5 B02 森田 男
 
<<シート:sheet2>>
 A  B   C   D E
1 
2 タイトル(10セルを結合)
3 番号 No. 住所 年齢 特徴
4 同上 同上 同上 同上 同上← 3と4のセルを結合

~ 1 A01 東京 19歳 国語が得意← 5〜19のセルを結合
19
20
~ 2 A02 鹿児島 19歳 国語、国語、英語、数学、運動が得意← 20〜34のセルを結合 
34
35
~ 3 A03 アメリカ 19歳 数学が得意← 35〜49のセルを結合
49
50
~ 4 A04 長野 19歳 数学が得意← 50〜64のセルを結合
64
 
 <<シート:result>>

 
  A  B   C   D  E F
1 
2 タイトル(12セルを結合)
3 番号 No. 住所 名前 年齢 特徴
4 同上 同上 同上 同上 同上 同上← 3と4のセルを結合

~ 1 A01 東京 梅尾 19歳 国語が得意← 5〜19のセルを結合
19
20
~ 2 A02 鹿児島 福田 19歳 国語、国語、英語、←改行させる
数学、運動が得意← 20〜34のセルを結合
34
・ツリー全体表示

【75554】Re:ループ→転記→ループ→転記
回答  こたつねこ  - 14/5/16(金) 21:37 -

引用なし
パスワード
   him さん、こんばんは

>将来的にコピー範囲も広げていきたいたと思っています。
>C30→C30:C40、D30→D30:D40、E30→E30:E40、F30→F30:F40に広げた場合は
>どのようにしたらいいでしょうか?
γさんの質問のおかげで、クリアになった部分も含めて修正しておきます。
こんな感じでどうでしょうか。

標準モジュールにコピーしてお使いください。

Option Explicit

'定数宣言
'------------------------------------------------------------------------
'シート名
Private Const C_SHT_NAME_FM As String = "1"  '転記元シート名
Private Const C_SHT_NAME_TO As String = "2"  '転記先シート名
Private Const C_SHT_NAME_DT As String = "3"  'データシート名
'------------------------------------------------------------------------
'転記元設定
Private Const C_EVT_ADDR_S1 As String = "B4" 'シート1の参照元データ指定セルアドレス
Private Const C_PST_ADDR_01 As String = "C30" 'シート1の転記元アドレス1
Private Const C_PST_ADDR_02 As String = "D30" 'シート1の転記元アドレス2
Private Const C_PST_ADDR_03 As String = "E30" 'シート1の転記元アドレス3
Private Const C_PST_ADDR_04 As String = "F30" 'シート1の転記元アドレス4
Private Const C_PST_ROWS As Long = 11     '転記元データの行数
'------------------------------------------------------------------------
'転記先設定
Private Const C_STR_COL_01 As String = "A"  'シート2の転記先列1
Private Const C_STR_COL_02 As String = "B"  'シート2の転記先列2
Private Const C_STR_COL_03 As String = "C"  'シート2の転記先列3
Private Const C_STR_COL_04 As String = "D"  'シート2の転記先列4
Private Const C_ROW_POSTSTART As Long = 2   '転記開始行 ex:2行目から転記開始
'------------------------------------------------------------------------
'データシート設定
Private Const C_PRIMARYKEY As String = "C"  'データシートのPrimaryKey列
Private Const C_ROW_DATASTART As Long = 3   'データ開始行
'------------------------------------------------------------------------


Public Sub sample()
 Dim ShtTo As Excel.Worksheet     '転記先シートObject
 Dim ShtFm As Excel.Worksheet     '転記元シートObject
 Dim StartNo As String         '先頭データ指定番号格納
 Dim StopNo As String         '最終データ指定番号格納
 Dim TargetNo As Long         '処理対象データ番号格納
 Dim PostRow As Long          '転記先行番号格納用
 Dim FlgPost As Boolean        '転記判定用フラグ
 Dim Msg As String           'エラーメッセージ格納
 
 '追加***************************Start
 Dim ShtDt As Excel.Worksheet
 Dim PostVal01 As Variant
 Dim PostVal02 As Variant
 Dim PostVal03 As Variant
 Dim PostVal04 As Variant
 Dim LoopRow As Long
 Dim DataRow As Long
 '追加***************************End
 
 '対象データの先頭と最終を取得
 StartNo = Application.InputBox(prompt:="先頭の番号を入力してください")
 StopNo = Application.InputBox(prompt:="最終の番号を入力してください")
 
 If (CheckInput(StartNo, StopNo, Msg) = False) Then
  MsgBox Msg, vbCritical, "エラー"
 Else
  Set ShtTo = ThisWorkbook.Sheets(C_SHT_NAME_TO)
  Set ShtFm = ThisWorkbook.Sheets(C_SHT_NAME_FM)
  Set ShtDt = ThisWorkbook.Sheets(C_SHT_NAME_DT)
  
  '入力された先頭番号から最終番号の間繰り返す
  For TargetNo = CLng(StartNo) To CLng(StopNo)
   'データ番号からデータシートの行数を計算
   DataRow = TargetNo + C_ROW_DATASTART - 1
   
   '転記元シートの参照先指定セルに番号をセット
   ShtFm.Range(C_EVT_ADDR_S1).Value = ShtDt.Range(C_PRIMARYKEY & CStr(DataRow)).Value
   
   '変更***************************Start
   
   '転記元のデータを各列ごとに一旦配列に取込む
   PostVal01 = ShtFm.Range(C_PST_ADDR_01).Resize(C_PST_ROWS).Value
   PostVal02 = ShtFm.Range(C_PST_ADDR_02).Resize(C_PST_ROWS).Value
   PostVal03 = ShtFm.Range(C_PST_ADDR_03).Resize(C_PST_ROWS).Value
   PostVal04 = ShtFm.Range(C_PST_ADDR_04).Resize(C_PST_ROWS).Value
   
   For LoopRow = 1 To C_PST_ROWS
   
    '転記判定フラグを転記するにセット
    FlgPost = True
    
    '条件:値0がある場合は転記判定フラグを転記しないにセット
    If (PostVal01(LoopRow, 1) = 0) Then
     FlgPost = False
    ElseIf (PostVal02(LoopRow, 1) = 0) Then
     FlgPost = False
    ElseIf (PostVal03(LoopRow, 1) = 0) Then
     FlgPost = False
    ElseIf (PostVal04(LoopRow, 1) = 0) Then
     FlgPost = False
    End If
    
    '転記判定フラグが転記するの場合転記
    If (FlgPost) Then
     '転記先行番号取得
     PostRow = ShtTo.Range(C_STR_COL_01 & ShtTo.Rows.Count).End(xlUp).Offset(1, 0).Row
     
     'データがない場合は【C_ROW_POSTSTART】で指定した行数
     If (PostRow < C_ROW_POSTSTART) Then PostRow = C_ROW_POSTSTART
     
     '転記
     ShtTo.Range(C_STR_COL_01 & PostRow).Value = PostVal01(LoopRow, 1)
     ShtTo.Range(C_STR_COL_02 & PostRow).Value = PostVal02(LoopRow, 1)
     ShtTo.Range(C_STR_COL_03 & PostRow).Value = PostVal03(LoopRow, 1)
     ShtTo.Range(C_STR_COL_04 & PostRow).Value = PostVal04(LoopRow, 1)
    End If
   Next
  Next
 End If
End Sub

Private Function CheckInput(ByVal StartVal As String, ByVal StopVal As String, ByRef Msg As String) As Boolean
 Dim DataRowMax As Long        'データシート最大行格納
 Dim ShtDt As Excel.Worksheet     'データシートObject

 Set ShtDt = ThisWorkbook.Sheets(C_SHT_NAME_DT)
 'データシートの最大行を取得
 DataRowMax = ShtDt.Range(C_PRIMARYKEY & ShtDt.Rows.Count).End(xlUp).Row
 Msg = ""

 If (DataRowMax < C_ROW_DATASTART And ShtDt.Range(C_PRIMARYKEY & "1").Value = "") Then
  Msg = "データシートにデータがありません。"
 ElseIf Not (IsNumeric(StartVal)) Then
  Msg = "先頭番号には数値を指定してください。"
 ElseIf Not (IsNumeric(StopVal)) Then
  Msg = "最終番号には数値を指定してください。"
 ElseIf (CLng(StartVal) <= 0) Then
  Msg = "先頭の番号が小さすぎます。"
 ElseIf (CLng(StopVal) <= 0) Then
  Msg = "最終の番号が小さすぎます。"
 ElseIf (DataRowMax < CLng(StartVal)) Then
  Msg = "先頭の番号が大きすぎます。"
 ElseIf (DataRowMax < CLng(StopVal)) Then
  Msg = "最終の番号が大きすぎます。"
 ElseIf (CLng(StartVal) > CLng(StopVal)) Then
  Msg = "先頭の番号より最終の番号の方が大きいです。"
 End If

 If (Msg = "") Then
  CheckInput = True
 Else
  CheckInput = False
 End If
End Function
・ツリー全体表示

【75553】Re:ループ→転記→ループ→転記
発言  γ  - 14/5/15(木) 23:09 -

引用なし
パスワード
   それではこういうことですか?

Sub test2()
  Dim i As Long
  Dim x As Long
  Dim y As Long
  Dim r As Range
  Dim c As Range

  x = Application.InputBox(prompt:="先頭の番号を入力してください")
  y = Application.InputBox(prompt:="最終の番号を入力してください")

  For i = x To y
    '>3列目の3行目からです。(him氏)
    Worksheets("Sheet1").Range("B4").Value _
      = Worksheets("Sheet3").Cells(i + 2, 3).Value

    '> 正確にはC30:C40,D30:D40,E30:E40までを転記させたいです。(him氏)
    'というと、こういうことでOK?
    Worksheets("Sheet1").Range("C30:F40").Copy

    'A列のデータあり最終行の次の行に、値のみ貼り付ける
    With Worksheets("Sheet2")
      Set r = .Cells(.Rows.Count, 1).End(xlUp).Offset(1)
    End With
    r.PasteSpecial Paste:=xlPasteValues

    '貼り付けたあとの各セルについて、0 なら 消去 する
    For Each c In r.Resize(11, 4)
      If c.Value = 0 Then
        c.ClearContents
      End If
    Next
  Next
End Sub
・ツリー全体表示

【75552】Re:ループ→転記→ループ→転記
質問  him  - 14/5/15(木) 21:47 -

引用なし
パスワード
   こたつねこ さん

こんばんは。
お世話になります。
将来的にコピー範囲も広げていきたいたと思っています。
C30→C30:C40、D30→D30:D40、E30→E30:E40、F30→F30:F40に広げた場合はどのようにしたらいいでしょうか?

ご教示よろしくお願い致します。
・ツリー全体表示

【75551】Re:ループ→転記→ループ→転記
発言  γ  - 14/5/15(木) 6:18 -

引用なし
パスワード
   A列のデータがある最終のセルは、
シートの最終行から上にジャンプすることで得られます。
Cells(Rows.Count, 1).End(xlUp) ですね。

書き込むのはその直ぐ下ですから、
Cells(Rows.Count, 1).End(xlUp).Offset(1)
です。
これを参考にコードを組み立ててみてください。
・ツリー全体表示

【75550】Re:ループ→転記→ループ→転記
質問  him  - 14/5/15(木) 2:08 -

引用なし
パスワード
   γ さん
こんばんは。
あともう少しご教示お願い致します。

シート2に転記された後、次のデータを転記された最終行の下に次々と転記していきたいのです。(今の状態はデータが転記されたあと、一番上の行に戻って上書きされてしまいます)
どのようにすればいいでしょうか?ご教示よろしくお願い致します。
(説明下手で申し訳ありません)
・ツリー全体表示

【75549】Re:番地が日付に変わる
発言  kanabun  - 14/5/15(木) 0:10 -

引用なし
パスワード
   横から失礼します

▼初心者です さん:
>csvファイルをTextでの取り込みで大丈夫

[Data]メニューの「テキストファイルのインポート」の機能を使えば
大丈夫なはずです。

ただし、ウィザードでデータ型を「文字列」と指定し忘れると、
31-1 は 1月31日  に、
60-3 は Mar-60  に、
63-1 は Jan-63  に読み替えられてしまいます。

もちろん拡張子がCSVだからといって、
Excelのファイルメニューから「開く」としてはだめですよ。
・ツリー全体表示

【75548】Re:番地が日付に変わる
発言  γ  - 14/5/14(水) 21:07 -

引用なし
パスワード
   5-1
31-1
40-1
はそれぞれどうなりますか?

入力には日付データはまったくありませんか?
仮に 2014/5/1のようなデータがあると、
5-1 が 変換されてしまったものなのか、
もともと日付データだったのか見分けが付かないと思います。

私はもう一度最初からやりなおしたほうが早いと思いますが、
> 今回は使用できないため良い方法があれば教えて下さい。
使用できない理由はなんでしょうか。
後学のため教えてください。
・ツリー全体表示

【75547】Re:日付と文字列の結合についてお尋ね
お礼  新参者  - 14/5/14(水) 7:32 -

引用なし
パスワード
   γ さんへ 

大変参考になりました。
有難うございました。
・ツリー全体表示

【75546】Re:ループ→転記→ループ→転記
発言  γ  - 14/5/13(火) 22:16 -

引用なし
パスワード
   こういうことですか?
骨格だけとお考え下さい。

Sub test()
  Dim x As Long
  Dim y As Long
  
  x = Application.InputBox(prompt:="先頭の番号を入力してください")
  y = Application.InputBox(prompt:="最終の番号を入力してください")

  k = 1
  For i = x To y
    Worksheets("Sheet1").Range("B4").Value = Worksheets("Sheet3").Cells(i + 2, 3).Value
    Worksheets("Sheet1").Range("C30:F30").Copy
    k = k + 1
    Worksheets("Sheet2").Cells(k, 1).PasteSpecial Paste:=xlPasteValues
    For j = 1 To 4
      If Worksheets("Sheet2").Cells(k, j).Value = 0 Then
        Worksheets("Sheet2").Cells(k, j).ClearContents
      End If
    Next
  Next
End Sub
・ツリー全体表示

【75545】Re:ループ→転記→ループ→転記
回答  him  - 14/5/13(火) 21:28 -

引用なし
パスワード
   γ さん


こんばんは。
お世話になります。
下記の通り回答致します。
よろしくお願い致します。


>
>(Q1)「シート3のデータ番号の入力範囲」とは何ですか?
>  1から100 とした場合は、1行目から100行目ということですか?
>  何列目ですか?
   →3列目の3行目からです。


>(Q2)その100個の値を、順にSheet1のB4セルに入れて、
>  その結果の C30,D30,E30,F30 の4つのセルの値を
>  Sheet2に転記する作業を100回繰り返すのですね?
>  →正確にはC30:C40,D30:D40,E30:E40までを転記させたいです。
   

>(Q3)転記先は、どこのセルから始めるのですか?
  →A2、B2、C2、D2へ転記したいです。
・ツリー全体表示

【75544】Re:ループ→転記→ループ→転記
お礼  him  - 14/5/13(火) 21:23 -

引用なし
パスワード
   こたつねこ さん

こんばんは。
コードありがとうございました。
試しながら改良してみたいと思います。
行き詰ったらまた再度ご教示お願い致します。
・ツリー全体表示

【75543】Re:日付と文字列の結合についてお尋ね
発言  γ  - 14/5/13(火) 20:59 -

引用なし
パスワード
   ▼新参者 さん:
>'   Range("C7") = "=Text(Date(A1,B1,C1),"ge. M")"
>Excel関数をマクロで使いたいのですが、コマンド部分が実行できません。
>どの様にすればよろしいでしょうか、教えてください。
" "の中でさらに"を使うには、"を二つ続けて書くのがきまりです。

  Range("C7") = "=Text(Date(A1,B1,C1),""ge. M"")"
ですね。
計算式を入れるのではなく、計算した文字列を書き込むなら、
  Range("C7") = Format(DateSerial(a1.Value, b1.Value, c1.Value), "ge. M")
のようにしますね。
・ツリー全体表示

【75542】番地が日付に変わる
質問  初心者です  - 14/5/13(火) 15:58 -

引用なし
パスワード
   過去の質問内容にcsvファイルをTextでの取り込みで大丈夫
と明記されているのは見つけたのですが、
その方法を今回は使用できないため良い方法があれば教えて下さい。

番地の"63-1" が "Jan-63"と日付形式となってしまいます。

そこで、以下の1.か2.の方法があれば教えて頂けませんでしょうか
1.VBAにてデータを"63-1"の文字列に戻す方法
csvデータ Jan-63 を 63-1(文字列)へ変更

2."セルの書式が日付になっています"とアラートを表示する方法

1.の方法が分かれば1番助かります。
1.の方法がない場合は、2.の方法を教えて下さい。
・ツリー全体表示

343 / 3841 ページ ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free