Excel VBA質問箱 IV

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

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


2013 / 13645 ツリー ←次へ | 前へ→

【70424】助けてください K・Y 11/11/15(火) 18:43 質問[未読]
【70429】Re:助けてください UO3 11/11/15(火) 21:52 発言[未読]
【70453】Re:助けてください K・Y 11/11/17(木) 14:19 発言[未読]
【70458】Re:助けてください UO3 11/11/17(木) 19:14 回答[未読]
【70473】Re:助けてください K・Y 11/11/19(土) 2:09 質問[未読]
【70479】Re:助けてください UO3 11/11/19(土) 18:27 発言[未読]
【70489】Re:助けてください K・Y 11/11/20(日) 14:15 発言[未読]
【70497】Re:助けてください UO3 11/11/21(月) 10:36 回答[未読]
【70513】Re:助けてください K・Y 11/11/22(火) 22:08 お礼[未読]

【70424】助けてください
質問  K・Y  - 11/11/15(火) 18:43 -

引用なし
パスワード
   初めまして。VBAを勉強し始めたばっかりの素人で色々と
調べているうちにここに辿り着きました。
VBAの勉強のために課題を出されたのですが
分からなくなったので質問させて頂きます

課題.xlsとタスク.xlsという2つのファイルがあって
課題.xlsのSheet1にあるデータをタスク.xlsにあるSheet1に
切り取りではなくコピーするマクロを組む課題です。

条件としては
課題.xlsにあるデータは場所が決まっておらず、任意の行をアクティブにして
依頼.xlsの最終データが書かれている次の行に移すというものです
丸々移すだけなら何とかなったんですが、課題の内容として

タスク.xlsの最新のデータが書かれているA列のxx行目を参照して
次の列に番号を振らないと行けない事300番目だったら次は301になるように
しなくてはいけません。

移すデータが課題.xlsのA:Cにあるデータの文字列を結合して
タスク.xlsのB行に移すのですが頭に"依"とつけて間を"-"で
結ばなければなりません。課題のB列は空白です。例であげると


課題.xlsのSheet1
    A列 B列 C列 
xx行目  1  △  22
タスク.xls B列
xx行目  依1-22

課題.xlsのLにあるデータをタスク.xlsのC列に移すのですが
ここにはデータを移すときに"依頼"を付けなければなりません。
課題のL列には数字が入ってるので"依頼xxxxx"というような感じに
移さないと行けません。

課題.xlsのY列にあるデータをK列に移すといった内容のものです

やっている内に頭がこんがらがって分からなくなりました
拙い文になってしまいましたがお力添えお願いします。
使っているのはExcel2003です。

【70429】Re:助けてください
発言  UO3  - 11/11/15(火) 21:52 -

引用なし
パスワード
   ▼K・Y さん:

こんばんは

>VBAの勉強のために課題を出されたのですが
>分からなくなったので質問させて頂きます

課題でしょうから、このような掲示板で回答をもらうというのは
「ズル」かもしれませんけど・・・

要件、わかりにくいのですが、

Sub Sample()
  Dim sh As Worksheet
  Dim v() As String
  Dim i As Long
  Dim k As Long
  Dim s As String
  Dim x As Long
  Dim c As Range
  Dim z As Long
  
  Application.ScreenUpdating = False
  Set sh = Workbooks("タスク.xls").Sheets("Sheet1")
  sh.Cells.ClearContents
  
  With Workbooks("課題.xls").Sheets("Sheet1")
    With .UsedRange
      z = .Cells(.Cells.Count).Row
    End With
    For Each c In .Range("A1:A" & z)
      ReDim v(1 To 3)
      x = c.Row
      k = 0
      For i = 1 To 3 'A列〜C列
        s = c.Offset(, i - 1).Value
        If Len(s) > 0 Then
          k = k + 1
          v(k) = s
        End If
      Next
      If k > 0 Then
        ReDim Preserve v(1 To k)
        sh.Cells(x, "A").Value = "依" & Join(v, "-")
      End If
      
      sh.Cells(x, "C").Value = "依頼" & Format(Val(.Cells(x, "L")), "00000")
      sh.Cells(x, "K").Value = .Cells(x, "Y").Value
    Next
  End With
  
  sh.Parent.Activate
  sh.Select
  Set sh = Nothing
  Application.ScreenUpdating = True
  MsgBox "転記終了しました"
  
End Sub

【70453】Re:助けてください
発言  K・Y  - 11/11/17(木) 14:19 -

引用なし
パスワード
   UO3さんありがとうございます
非常に助かりました。
返信が遅くなり申し訳ございません。

ズルはよくないのは分かっているのですが
来週末の現場撤退前に終わらせたく助けを求めた次第です。
要件が分かりづらくすいません。

もう少し質問なのですが
「sh.Cells.ClearContents」でタスク.xlsのSheet1にあるデータを削除
していると思うのですが

タスク.xlsのSheet1のデータを残したまま最終行に追記していくには
どうすればいいのでしょうか?
まだVBAを勉強して2週間足らずで分からないことが多く
申し訳ございません。

【70458】Re:助けてください
回答  UO3  - 11/11/17(木) 19:14 -

引用なし
パスワード
   ▼K・Y さん:

じゃぁこれで。

Sub Sample2()
  Dim sh As Worksheet
  Dim v() As String
  Dim i As Long
  Dim k As Long
  Dim s As String
  Dim x As Long
  Dim c As Range
  Dim z As Long
  
  Application.ScreenUpdating = False
  Set sh = Workbooks("タスク.xls").Sheets("Sheet1")
  x = sh.Range("A" & sh.Rows.Count).End(xlUp).Row
  
  With Workbooks("課題.xls").Sheets("Sheet1")
    With .UsedRange
      z = .Cells(.Cells.Count).Row
    End With
    For Each c In .Range("A1:A" & z)
      ReDim v(1 To 3)
      k = 0
      For i = 1 To 3 'A列〜C列
        s = c.Offset(, i - 1).Value
        If Len(s) > 0 Then
          k = k + 1
          v(k) = s
        End If
      Next
      
      x = x + 1
      
      If k > 0 Then
        ReDim Preserve v(1 To k)
        sh.Cells(x, "A").Value = "依" & Join(v, "-")
      End If
      
      sh.Cells(x, "C").Value = "依頼" & Format(Val(.Cells(x, "L")), "00000")
      sh.Cells(x, "K").Value = .Cells(x, "Y").Value
    Next
  End With
  
  sh.Parent.Activate
  sh.Select
  Set sh = Nothing
  Application.ScreenUpdating = True
  MsgBox "転記終了しました"
  
End Sub

【70473】Re:助けてください
質問  K・Y  - 11/11/19(土) 2:09 -

引用なし
パスワード
   UO3さん
早い返信ありがとうございます。
ここで思ったのですが

With .UsedRange
z = .Cells(.Cells.Count).Row

ここで範囲内にあるデータを見て
行からデータを持っていく準備をするような感じで
行全体から必要なデータを抜き出していくという流れだと思うのですが

myCell.Select
を使用すれば自分が必要とする行だけ抜き出すことが出来ますか?

【70479】Re:助けてください
発言  UO3  - 11/11/19(土) 18:27 -

引用なし
パスワード
   ▼K・Y さん:

>myCell.Select
>を使用すれば自分が必要とする行だけ抜き出すことが出来ますか?

myCell ってなんですか?
それと、自分が必要とする行って何ですか?

【70489】Re:助けてください
発言  K・Y  - 11/11/20(日) 14:15 -

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

Dim myCell As Range
Set myCell = ActiveCell

アクティブ化したセルを取ってくるようしておきます。
課題.xlsのSheet1の1〜400までの行にデータが入ってるとします。
例えば、欲しいのが100行目だった場合に、100行目を選んでその行の
セルを全てアクティブ化して
タスク.xlsのSheet1の最終行にデータを追記していくように
出来るのかなっと思い質問したのですが
分かりづらくてすいませんでした。

【70497】Re:助けてください
回答  UO3  - 11/11/21(月) 10:36 -

引用なし
パスワード
   ▼K・Y さん:

おはようございます

それでは、対象行のA列を選択(複数可)して実行するコードです。
Sample3は、実行前に選択しておきます。
Sample4はマクロの中で最初に選択させます。

Sub Sample3()
  Dim shT As Worksheet
  Dim shK As Worksheet
  Dim v() As String
  Dim i As Long
  Dim k As Long
  Dim s As String
  Dim x As Long
  Dim c As Range
  Dim z As Long
  
  Dim myA As Range
  Dim myCell As Range
  
  Application.ScreenUpdating = False

  Set shK = Workbooks("課題.xls").Sheets("Sheet1")
  Set shT = Workbooks("タスク.xls").Sheets("Sheet1")
  x = shT.Range("A" & shT.Rows.Count).End(xlUp).Row
  
  shK.Parent.Activate  '課題.xlsを最前面に
  shK.Activate     '対象シートを最前面に
  If TypeName(Selection) <> "Range" Then
    MsgBox "対象行のA列のセルを選択をしてください(複数可)"
  Else
    Set myA = Intersect(Selection, shK.Columns("A"))
    For Each myCell In myA
      z = myCell.Row
      For Each c In shK.Range("A1:A" & z)
        ReDim v(1 To 3)
        k = 0
        For i = 1 To 3 'A列〜C列
          s = shK.Cells(z, i).Value
          If Len(s) > 0 Then
            k = k + 1
            v(k) = s
          End If
        Next
      Next
      x = x + 1

      If k > 0 Then
        ReDim Preserve v(1 To k)
        shT.Cells(x, "A").Value = "依" & Join(v, "-")
      End If

      shT.Cells(x, "C").Value = "依頼" & Format(Val(shK.Cells(z, "L")), "00000")
      shT.Cells(x, "K").Value = shK.Cells(z, "Y").Value
      
    Next
  End If
  
 
  shT.Parent.Activate
  shT.Select
  
  Set myA = Nothing
  Set shT = Nothing
  Set shK = Nothing

  Application.ScreenUpdating = True
  MsgBox "転記終了しました"
 
End Sub

Sub Sample4()
  Dim shT As Worksheet
  Dim shK As Worksheet
  Dim v() As String
  Dim i As Long
  Dim k As Long
  Dim s As String
  Dim x As Long
  Dim c As Range
  Dim z As Long
  
  Dim myA As Range
  Dim myCell As Range
  

  Set shK = Workbooks("課題.xls").Sheets("Sheet1")
  Set shT = Workbooks("タスク.xls").Sheets("Sheet1")
  x = shT.Range("A" & shT.Rows.Count).End(xlUp).Row
  
  shK.Parent.Activate  '課題.xlsを最前面に
  shK.Activate     '対象シートを最前面に
  
  On Error Resume Next
  Set myA = Application.InputBox("対象の行のA列を選択してください(複数可)", Type:=8)
  On Error GoTo 0
  
  If Not myA Is Nothing Then
    Application.ScreenUpdating = False
    Set myA = Intersect(myA, shK.Columns("A"))
    
    For Each myCell In myA
      z = myCell.Row
      For Each c In shK.Range("A1:A" & z)
        ReDim v(1 To 3)
        k = 0
        For i = 1 To 3 'A列〜C列
          s = shK.Cells(z, i).Value
          If Len(s) > 0 Then
            k = k + 1
            v(k) = s
          End If
        Next
      Next
      x = x + 1

      If k > 0 Then
        ReDim Preserve v(1 To k)
        shT.Cells(x, "A").Value = "依" & Join(v, "-")
      End If

      shT.Cells(x, "C").Value = "依頼" & Format(Val(shK.Cells(z, "L")), "00000")
      shT.Cells(x, "K").Value = shK.Cells(z, "Y").Value
      
    Next
    
    shT.Parent.Activate
    shT.Select
    Application.ScreenUpdating = True
    MsgBox "転記終了しました"

  End If
  
  Set myA = Nothing
  Set shT = Nothing
  Set shK = Nothing

 
End Sub

【70513】Re:助けてください
お礼  K・Y  - 11/11/22(火) 22:08 -

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

今までお付き合いありがとうございました。
参考になり大変勉強になりました。

ありがとうございました

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