Excel VBA質問箱 IV

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

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


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

【67183】Dim As、IF関数のコードがうまく実行されません。 あんず 10/11/14(日) 17:55 質問[未読]
【67184】Re:Dim As、IF関数のコードがうまく実行され... かみちゃん 10/11/14(日) 18:10 発言[未読]
【67185】Re:Dim As、IF関数のコードがうまく実行され... あんず 10/11/14(日) 18:28 質問[未読]
【67186】Re:Dim As、IF関数のコードがうまく実行され... かみちゃん 10/11/14(日) 18:33 発言[未読]
【67187】Re:Dim As、IF関数のコードがうまく実行され... あんず 10/11/14(日) 18:49 質問[未読]
【67188】Re:Dim As、IF関数のコードがうまく実行され... かみちゃん 10/11/14(日) 19:00 発言[未読]
【67189】Re:Dim As、IF関数のコードがうまく実行され... あんず 10/11/14(日) 19:46 質問[未読]
【67190】Re:Dim As、IF関数のコードがうまく実行され... Hirofumi 10/11/14(日) 19:58 発言[未読]
【67191】Re:Dim As、IF関数のコードがうまく実行され... かみちゃん 10/11/14(日) 20:06 発言[未読]

【67183】Dim As、IF関数のコードがうまく実行されま...
質問  あんず  - 10/11/14(日) 17:55 -

引用なし
パスワード
   B1からB5000まで下記のような表があります。

B列
40000
2038674
6023849
4962390
6832972
0971267
5672819
1197579
2000
6592872
9672816
0694827
1832575
0498672

ここで、値が4000ならひとつ下の行のN列に4000と入力し、2000なら2000を入力、それ以外ならN列のひとつ上のセルをコピーさせる。とゆう感じにしたいのです。
こんな感じ↓

B列           N列
40000          
2038674         4000
6023849         4000
4962390         4000
6832972         4000
0971267         4000
5672819         4000
1197579         4000
2000
6592872         2000
9672816         2000
0694827         2000
1832575         2000
0498672         2000

で、自分なりに書いてみたけど成功しません。
教えて下さいm(__)m

Dim GYOU As Long
Dim Bretu As Integer

For GYOU = 1 To 5000
Bretu = Range("B",GYOU)
  
If Bretu.Value = "4000" Then
  Bretu.Offset(1, 12).Value = "4000"
   
  Else: Offset(-1).Copy    
End If
  
ActiveCell.Offset(1).Activate
Next GYOU

【67184】Re:Dim As、IF関数のコードがうまく実行さ...
発言  かみちゃん E-MAIL  - 10/11/14(日) 18:10 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>ここで、値が4000ならひとつ下の行のN列に4000と入力し、2000なら2000を入力、それ以外ならN列のひとつ上のセルをコピーさせる。とゆう感じにしたいのです。
>
>で、自分なりに書いてみたけど成功しません。

ご自身で書かれたコードをできるだけ活かすように修正するとすれば、
以下のようにすればできると思います。

Sub Sample()
 Dim GYOU As Long
' Dim Bretu As Integer
 Dim Bretu As Range
 Dim Nretu As Variant
 
 For GYOU = 1 To 5000
  Set Bretu = Range("B", GYOU)
   
  If Bretu.Value = "4000" Then
'    Bretu.Offset(1, 12).Value = "4000"
    Nretu = Bretu.Value
'    Else: Offset(-1).Copy
  Else
    Bretu.Offset(1, 12).Value = Nretu
  End If
   
'  ActiveCell.Offset(1).Activate
 Next GYOU
End Sub

がんばってください。

【67185】Re:Dim As、IF関数のコードがうまく実行さ...
質問  あんず  - 10/11/14(日) 18:28 -

引用なし
パスワード
   かみちゃんさん、お返事ありがとうございます!!

Dim GYOU As Long
Dim Bretu As Range
Dim Nretu As Variant

For GYOU = 1 To 5000
 Set Bretu = Range("B", GYOU)   (←ここでひっかかりました。)
 
 If Bretu.Value = "4000" Then
 Nretu = Bretu.Value
   
 Else
 Bretu.Offset(1, 12).Value = Nretu
 End If
 
Next GYOU

上記に書き換えましたが、引っかかってしまいました。

なぜでしょうか。。。

【67186】Re:Dim As、IF関数のコードがうまく実行さ...
発言  かみちゃん E-MAIL  - 10/11/14(日) 18:33 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>上記に書き換えましたが、引っかかってしまいました。
>
>なぜでしょうか。。。

申し訳ありません。
動作確認していませんでした。

 Set Bretu = Range("B", GYOU)



 Set Bretu = Range("B"&GYOU)

に書き換えるか

 Set Bretu = Cells(GYOU, "B")

としてください。

なお、

> ←ここでひっかかりました。
>
> 引っかかってしまいました。

「引っかかる」というのは、どういう意味でしょうか?
エラーメッセージが出たなにらば、「エラーで止まりました」というのが正しい表現で、
そのエラーメッセージを正確に書く癖をつけましょう。

【67187】Re:Dim As、IF関数のコードがうまく実行さ...
質問  あんず  - 10/11/14(日) 18:49 -

引用なし
パスワード
   かみちゃんさん、お返事ありがとうございます!!

> Set Bretu = Range("B"&GYOU)
>
>に書き換えるか
>
> Set Bretu = Cells(GYOU, "B")
>
>としてください。

Set Bretu = Range("B"&GYOU)
とさせていただきました、ありがとうございました!!


>「引っかかる」というのは、どういう意味でしょうか?
>エラーメッセージが出たなにらば、「エラーで止まりました」というのが正しい表現で、
>そのエラーメッセージを正確に書く癖をつけましょう。

はい!申し訳ありません。。。
今後十分気を付けますm(__)m

追加質問ですが、4000ならば4000を入力、2000ならば2000を入力、6000ならば6000を入力、としたい場合。

If Bretu.Value = "4000" Then
  Nretu = Bretu.Value
   
  Else
  Bretu.Offset(1, 12).Value = Nretu
End If

If Bretu.Value = "2000" Then
  Nretu = Bretu.Value
   
  Else
  Bretu.Offset(1, 12).Value = Nretu
End If

If Bretu.Value = "6000" Then
  Nretu = Bretu.Value
   
  Else
  Bretu.Offset(1, 12).Value = Nretu
End If

とする方法が正しいのでしょうか。。。

教えて下さいm(__)m

【67188】Re:Dim As、IF関数のコードがうまく実行さ...
発言  かみちゃん E-MAIL  - 10/11/14(日) 19:00 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>追加質問ですが、4000ならば4000を入力、2000ならば2000を入力、6000ならば6000を入力、としたい場合。

以下のような書き方もできます。

If Bretu.Value = "2000" Or Bretu.Value = "6000" Or Bretu.Value = "6000" Then
  Nretu = Bretu.Value
Else
  Bretu.Offset(1, 12).Value = Nretu
End If

2000で割り切れるというルールがあるならば、もう少し簡単になりますし、
前回の
http://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=67175;id=excel
に関連しているのであれば、もう少し簡単にすることができます。
("部:"が含まれているときに書き換えると同時にN列の設定をする)

【67189】Re:Dim As、IF関数のコードがうまく実行さ...
質問  あんず  - 10/11/14(日) 19:46 -

引用なし
パスワード
   かみちゃんさん、お返事ありがとうございます!!

>If Bretu.Value = "2000" Or Bretu.Value = "6000" Or Bretu.Value = "6000" Then
>  Nretu = Bretu.Value
>Else
>  Bretu.Offset(1, 12).Value = Nretu
>End If

上記で、思い通りに成功させることが出来ました!!
ありがとうございます!!


>前回の
>http://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=67175;id=excel
>に関連しているのであれば、もう少し簡単にすることができます。
>("部:"が含まれているときに書き換えると同時にN列の設定をする)

関連しています、それはどんな方法になりますでしょうか。
難易度が高いでしょうから、勉強させて下さいm(__)m

【67190】Re:Dim As、IF関数のコードがうまく実行さ...
発言  Hirofumi  - 10/11/14(日) 19:58 -

引用なし
パスワード
   こんなで

Option Explicit

Public Sub Sample_2()

  Const cstrChar As String = "部:"
  
  Dim i As Long
  Dim vntData() As Variant
  Dim strData() As Variant
  Dim N() As Variant
  Dim vntNumb As Variant
'  Dim N() As String '★文字列として代入の場合
  Dim lngPos As Long
  
  With ActiveSheet
    vntData = Range(.Cells(1, "B"), .Cells(Rows.Count, "B").End(xlUp)).Value
  End With
  
  ReDim strData(1 To UBound(vntData, 1), 1 To 1)
  ReDim N(1 To UBound(vntData, 1), 1 To 1)
  
  For i = 1 To UBound(vntData, 1)
    lngPos = InStr(1, vntData(i, 1), cstrChar, vbTextCompare)
    If lngPos > 0 Then
      vntNumb = Val(Mid(vntData(i, 1), lngPos + Len(cstrChar)))
      strData(i, 1) = CStr(vntNumb)
    Else
      strData(i, 1) = CStr(vntData(i, 1))
      N(i, 1) = vntNumb
    End If
  Next i
  
  With ActiveSheet
    .Cells(1, "B").Resize(UBound(strData, 1)).Value = strData
    .Cells(1, "N").Resize(UBound(strData, 1)).Value = N
  End With
  
End Sub

【67191】Re:Dim As、IF関数のコードがうまく実行さ...
発言  かみちゃん E-MAIL  - 10/11/14(日) 20:06 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>>前回の
>>http://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=67175;id=excel
>>に関連しているのであれば、もう少し簡単にすることができます。
>>("部:"が含まれているときに書き換えると同時にN列の設定をする)
>
>関連しています、それはどんな方法になりますでしょうか。

Hirofumiさんより。またコメントが出ているようですが、
ご自身で書かれたコードをできるだけ活かして、Hirofumiさんのアドバイスを
最低限のものだけ盛り込むとすれば、以下のようになります。

Sub Sample2()
 Const cstrChar As String = "部:"
 Dim GYOU As Long
 Dim Bretu As Range
 Dim lngPos As Long
 Dim Nretu As Variant

 For GYOU = 1 To 5000
  Set Bretu = Range("B", GYOU)
  lngPos = InStr(1, Bretu.Value, cstrChar, vbTextCompare)
  If lngPos > 0 Then
   Nretu = Val(Mid(Bretu.Value, lngPos + Len(cstrChar)))
  Else
   Bretu.Offset(1, 12).Value = Nretu
  End If
 Next GYOU
End Sub

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