Excel VBA質問箱 IV

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

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


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

【75541】日付と文字列の結合についてお尋ね
質問  新参者  - 14/5/13(火) 14:32 -

引用なし
パスワード
      A   B   C   D
1 2013  9   1   H25年9月
2 2014  10  30   H26年11月
3
4
5
6
7       H25.9  
8       H26.11 
9
10       H25.9〜H26.11
以上の様な表示をしたいのですが・・・・

Sub test()
 Dim a1 As Range, b1 As Range, c1 As Range
 Dim a2 As Range, b2 As Range, c2 As Range
  
  Set a1 = Range("b1")
  Set b1 = Range("b1")
  Set c1 = Range("c1")
  Set a2 = Range("a2")
  Set b2 = Range("b2")
  Set c2 = Range("c2")
  
  Cells(1, 4) = "=Date(A1,B1,C1)"
  Cells(2, 4) = "=Date(A2,B2,C2)"
  
'   Range("C7") = "=Text(Date(A1,B1,C1),"ge. M")"
'  Cells(8, 3) = "=Text(Date(A2,B2,C2)," ge. M")"
  
  Range("c10").Value = Range("c7").Value & " 〜 " & Range("c8").Value
End Sub
  
Excel関数をマクロで使いたいのですが、コマンド部分が実行できません。
どの様にすればよろしいでしょうか、教えてください。
・ツリー全体表示

【75540】Re:ループ→転記→ループ→転記
回答  こたつねこ  - 14/5/12(月) 22:41 -

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

不明な部分もありますが、こんな感じですかねぇ
適当にコメントを付けておきますので、ご要望の動作でない場合ご自分で修正
してみてください。

Public Sub sample()
 Const C_SHT_NAME_FM As String = "1"  '転記元シート名
 Const C_SHT_NAME_TO As String = "2"  '転記先シート名
 Const C_EVT_ADDR_S1 As String = "B4" 'シート1の参照元データ指定セルアドレス
 Const C_PST_ADDR_01 As String = "C30" 'シート1の転記元アドレス1
 Const C_PST_ADDR_02 As String = "D30" 'シート1の転記元アドレス2
 Const C_PST_ADDR_03 As String = "E30" 'シート1の転記元アドレス3
 Const C_PST_ADDR_04 As String = "F30" 'シート1の転記元アドレス4
 Const C_STR_COL_01 As String = "A"  'シート2の転記先列1
 Const C_STR_COL_02 As String = "B"  'シート2の転記先列2
 Const C_STR_COL_03 As String = "C"  'シート2の転記先列3
 Const C_STR_COL_04 As String = "D"  'シート2の転記先列4
 
 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           'エラーメッセージ格納
 
 '対象データの先頭と最終を取得
 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)
  
  '入力された先頭番号から最終番号の間繰り返す
  For TargetNo = CLng(StartNo) To CLng(StopNo)
   '転記元シートの参照先指定セルに番号をセット
   ShtFm.Range(C_EVT_ADDR_S1).Value = TargetNo
   
   '転記判定フラグを転記するにセット
   FlgPost = True
   
   '条件:値0がある場合は転記判定フラグを転記しないにセット
   If (ShtFm.Range(C_PST_ADDR_01).Value = 0) Then
    FlgPost = False
   ElseIf (ShtFm.Range(C_PST_ADDR_02).Value = 0) Then
    FlgPost = False
   ElseIf (ShtFm.Range(C_PST_ADDR_03).Value = 0) Then
    FlgPost = False
   ElseIf (ShtFm.Range(C_PST_ADDR_04).Value = 0) Then
    FlgPost = False
   End If
   
   '転記判定フラグが転記するの場合転記
   If (FlgPost) Then
    '転記先行番号取得、データがない場合は1行目
    PostRow = ShtTo.Range(C_STR_COL_01 & ShtTo.Rows.Count).End(xlUp).Offset(1, 0).Row
    ShtTo.Range(C_STR_COL_01 & PostRow).Value = ShtFm.Range(C_PST_ADDR_01).Value
    ShtTo.Range(C_STR_COL_02 & PostRow).Value = ShtFm.Range(C_PST_ADDR_02).Value
    ShtTo.Range(C_STR_COL_03 & PostRow).Value = ShtFm.Range(C_PST_ADDR_03).Value
    ShtTo.Range(C_STR_COL_04 & PostRow).Value = ShtFm.Range(C_PST_ADDR_04).Value
   End If
  Next
 End If
End Sub

Private Function CheckInput(ByVal StartVal As String, ByVal StopVal As String, ByRef Msg As String) As Boolean
 Const C_SHT_NAME_DT As String = "3"  'データシート名
 Const C_PRIMARYKEY As String = "A"  'データシートのPrimaryKey列
 
 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 = 1 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
・ツリー全体表示

【75539】Re:ループ→転記→ループ→転記
発言  γ  - 14/5/12(月) 20:09 -

引用なし
パスワード
   > ・inputboxでシート3のデータ番号の入力範囲を設定したい(1から100など)
> ・上記のシート3の1のデータをシート1で計算され、
>  シート2に計算されたデータを転記したい。
> (0データがあった場合は転記しない。)
> (転記する部分はC30,D30,E30,F30)

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

(Q2)その100個の値を、順にSheet1のB4セルに入れて、
  その結果の C30,D30,E30,F30 の4つのセルの値を
  Sheet2に転記する作業を100回繰り返すのですね?

(Q3)転記先は、どこのセルから始めるのですか?
・ツリー全体表示

【75538】ループ→転記→ループ→転記
質問  him  - 14/5/11(日) 23:48 -

引用なし
パスワード
   こんばんは。

VBA初心者で困っています。
ご教示お願い致します。

状態(シート3枚)
シート1→計算式が入っておりB4セルの数値が変化によってシート3からVLOOKUPで
飛んできたデータで計算される。
シート2→転記シート(シート1で計算された結果が転記される)
シート3→元データ

やりたいこと
・inputboxでシート3のデータ番号の入力範囲を設定したい(1から100など)
・上記のシート3の1のデータをシート1で計算され、シート2に計算されたデータを転記したい。
(0データがあった場合は転記しない。)
(転記する部分はC30,D30,E30,F30)
そのあとシート2の転記されたデータの下に、続けてシート3のデータ2の計算を転記。その繰り返しをしたいのです。


分かりづらくてすみません。

ご教示よろしくお願い致します。


(下記が途中までです)

Dim x As Integer

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


line:

Worksheets("1").Select
Range("B4").Select

    For i = x To Y

       ActiveCell.FormulaR1C1 = i
・ツリー全体表示

【75537】Re:集計
発言  γ  - 14/5/10(土) 23:29 -

引用なし
パスワード
   kanabunさんのご指摘通り、確認もれです。
書式だけ文字列に変更してました。

これでは上手くいきませんね。
フィルタオプションで実際に抽出するのはできましたが、
DCOUNTで文字列を扱うのは難しいですね。

kanabunさんの案で行ってください。
・ツリー全体表示

【75536】Re:集計
発言  kanabun  - 14/5/10(土) 19:59 -

引用なし
パスワード
   ▼しろ さん:

> 数値は文字列になっています。

Sub test2()
  Dim v(), i As Long, k As Long
  
  v() = Range("A1").CurrentRegion
  For i = 1 To UBound(v)
    If v(i, 3) = "1" Then
     If v(i, 2) <> "0" Then
      If v(i, 1) <> "0" Then
        k = k + 1
      End If
     End If
    End If
  Next
  MsgBox "Count=" & k
End Sub
・ツリー全体表示

【75535】Re:集計
発言  γ  - 14/5/10(土) 19:35 -

引用なし
パスワード
   もしくは、ワークシート関数DCOUNTを使うかですね。

  A    B    C    D    E    F    G
1 aaa   bbb   ccc       aaa   bbb   ccc
2 0    1    1        <>0   <>0   1
3 1    0    0               
4 2    25   1               
5 5    2    1               
6 15   0    1               

Sub test()
  Dim myRange As Range
  Set myRange = Range("A1").CurrentRegion
  MsgBox Application.DCount(myRange, , Range("E1:G2"))
End Sub
・ツリー全体表示

【75534】Re:集計
発言  γ  - 14/5/10(土) 18:41 -

引用なし
パスワード
   ▼しろ さん:
>データ数は6万件を越え、毎回の集計の度に件数は変動します。
>データは自社システムから吐き出していて、数値は文字列になっています。
>関数を使うと結果が0になるので、コードを使って結果を出したいのです。
ああ、そうなんですか。追加情報ですね。

それなら、配列に取り込んだうえで演算すると早くなるかもしれません。
同じ考え方で繰り返し処理をしてはどうでしょうか。

どこまで出来てますか? 途中でも結構ですから示されては?
(配列は使っていなくてOKです。)

> myCount + myCount + 1
は myCount = myCount + 1
の間違いでした。
・ツリー全体表示

【75533】Re:集計
質問  しろ  - 14/5/10(土) 18:16 -

引用なし
パスワード
   ▼γ さん:
ありがとうございます。
データ数は6万件を越え、毎回の集計の度に件数は変動します。
データは自社システムから吐き出していて、数値は文字列になっています。
関数を使うと結果が0になるので、コードを使って結果を出したいのです。
・ツリー全体表示

【75532】Re:新しいシートをコピーから複製したの...
お礼  ほろ  - 14/5/10(土) 14:52 -

引用なし
パスワード
   ▼γ さん:
>どこまでがVBAで実行し、どこからが手作業したものなんでしょうか。
>
>たしかに想像しにくいですねえ。
>ひょっとするとBookが壊れかけているのかも知れませんね。
>新しいBookで再現しますか?


シートの複製までがVBAでの実行で
数値の入力は手作業です。

どうしても原因が分からないため新しいブックで新規作成することにしました。
回答どうもありがとうございました。
・ツリー全体表示

【75531】Re:ブレイクポイント
お礼  うし  - 14/5/10(土) 9:19 -

引用なし
パスワード
   γ さん
ありがとうございます。
コードのupも考えたのですが、シートごとでないと説明しにくい状況なので。
その後、大改造を施し何とか動き出しました。が
Application.ScreenUpdating = True
としているのに、更新されたりしなかったりで、???な状況です。
・ツリー全体表示

【75530】Re:新しいシートをコピーから複製したの...
発言  γ  - 14/5/9(金) 22:58 -

引用なし
パスワード
   どこまでがVBAで実行し、どこからが手作業したものなんでしょうか。

たしかに想像しにくいですねえ。
ひょっとするとBookが壊れかけているのかも知れませんね。
新しいBookで再現しますか?
・ツリー全体表示

【75529】新しいシートをコピーから複製したのです...
質問  ほろ  - 14/5/9(金) 22:39 -

引用なし
パスワード
   VBAを用いて
worksheets("A").copy after:=worksheets(worksheets.count)
を実行しシートBを作成したのですが
シートBに数値を入力してもセルには数値が入力されません。
それどころかカーソルをいくら下方向に移動させてもスクロールされず
先頭行が表示されたままの状態が続きます。

この状態でシートAに戻ってみると
シートBに入力した数値がシートAに入力されています。

さらにその状態からシートBに戻り
再びセルに数値を入力してみると今度は通常通り入力されます。

またシートBがある状態で再びシートAをコピーしシートCを作成した場合
シートCに入力しても数値は表示されず
今度はシートBに入力されます。

同様にシートDを作ればシートCに、シートZを作ればシートYの様に
一つ前のシートに入力され
再び元のシートに戻ると通常通りに入力が可能になります。

このようなことが起こる事は初めてで原因が全く想像できません。
何かお分かりになられる方がいらっしゃいましたらご教授ください。

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

【75528】Re:集計
発言  γ  - 14/5/9(金) 22:20 -

引用なし
パスワード
   ▼しろ さん:
>上記の例で、A列で0以外かつB列の0以外かつC列の1
>となる件数を計算するコードを書きたいのですが、どう
>すればよいのでしょうか。

こういう話は一般機能でよく出てきますね。
=SUM((A1:A5<>0)*(B1:B5<>0)*(C1:C5=1)) としてCtrl + Shift + Enter
とかなんとか。

コードでどうしてもということなら、
・If文で条件判定して、条件にあったら
   myCount + myCount + 1 などとして回数をカウントします。
・以上を、各行で繰り返します。
といったようなことになると思うのですが、
どのあたりに詰まっていますか?
お知らせ下さい。
・ツリー全体表示

【75527】Re:ブレイクポイント
発言  γ  - 14/5/9(金) 22:16 -

引用なし
パスワード
   ▼うし さん:
>2000で作ったマクロを2013で実行させると、無限ループにはまったようになりました。そこで、ブレイクポイントを要所に入れて試すと、意図した通りに最後まで行きます。ブレイクポイントを入れても数分で完了するものが、なしで実行すると一時間たっても終わりません。これって、どんなことが考えられるのでしょうか?
不思議ですね。
これだけのヒントだと回答つきにくいと思いますよ。
事象が再現できる簡単なコードを提示することはできますか?

# そうした作業中に新しい発見があるかもしれません。
・ツリー全体表示

【75526】集計
質問  しろ  - 14/5/9(金) 19:49 -

引用なし
パスワード
   A列  B列  C列
0    1    1
1    0    0
2    25    1
5    2    1
15    0    1
・    ・   ・
・    ・   ・ 
・    ・   ・

上記の例で、A列で0以外かつB列の0以外かつC列の1
となる件数を計算するコードを書きたいのですが、どう
すればよいのでしょうか。

A・B列の数値はランダムで、C列は0か1のみ。

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

【75525】ブレイクポイント
質問  うし  - 14/5/9(金) 11:29 -

引用なし
パスワード
   お世話になります。
2000で作ったマクロを2013で実行させると、無限ループにはまったようになりました。そこで、ブレイクポイントを要所に入れて試すと、意図した通りに最後まで行きます。ブレイクポイントを入れても数分で完了するものが、なしで実行すると一時間たっても終わりません。これって、どんなことが考えられるのでしょうか?
よろしくお願いします。
・ツリー全体表示

【75524】Re:散布図で対数表示できません
お礼  まめ  - 14/5/8(木) 16:51 -

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

お礼が大変遅くなり申し訳ありません。
色々弄っているうちに、他のところで致命的な問題が生じてしまって
復旧作業に明け暮れていた次第です。
ご回答誠にありがとうございます。

withステートメントから一旦抜けて、γ様のアドバイス通り
ActiveChart.SetElement (msoElementPrimaryCategoryAxisLogScale)
と記載しましたところ、正常に対数表示させることができました!

どうやっても表示できなかったので、本当に助かりました。
ありがとうございました!
・ツリー全体表示

【75523】Re:散布図で対数表示できません
お礼  まめ  - 14/5/8(木) 16:44 -

引用なし
パスワード
   ▼マナ さん:

お返事が遅くなり、大変申し訳ありません。
他の部分に不調が生じ、問題部分の確認ができないでおりましたが
やっと復旧したためお返事させていただきます。

B1の値は10なので、その点の問題は無いようです。
・ツリー全体表示

【75522】Re:散布図で対数表示できません
発言  γ  - 14/5/3(土) 20:54 -

引用なし
パスワード
   私のは2010環境なので、意味がないかもしれませんが。

.ScaleType = xlLogarithmic
は正常動作しました。

また、A1:A5をデータ範囲として、両対数目盛にする動作を
マクロ記録したら下記のようになりました。
Sub Macro1()
  ActiveSheet.Shapes.AddChart.Select
  ActiveChart.ChartType = xlXYScatterLines
  ActiveChart.SetSourceData Source:=Range("Sheet1!$A$1:$B$5")
  ActiveChart.SetElement (msoElementPrimaryCategoryAxisLogScale)
  ActiveChart.SetElement (msoElementPrimaryValueAxisLogScale)
End Sub
・ツリー全体表示

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