Excel VBA質問箱 IV

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

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


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

【81504】For nextの二重ループ文
質問  きんもくせい  - 20/10/6(火) 21:20 -

引用なし
パスワード
   はじめまして。VBAを学び始めて間もないものです。
配列とFor next文の二重ループで悩んでいます。
教えていただけないでしょうか。

◆設定
A,B,E,J列の1行目に項目(商品名、単価など)が入っている
その下にデータが100行ある
静的変数の宣言で0〜3までのインデックスを確保する
インデックスに項目名を格納
変数i、jを使ってfor nextの二重ループで
100行に適用し、隣のSheet2に転記したいです。

変数iが変化することで縦に値が入り、jが変化することで
横に値が入ることは分かるのですが。。。
下のコードのように、未完成で悩んでいます。
どのようにかいたらよいでしょうか?


Sub 練習1()

Dim arr(3) As String
Dim i As Long
Dim j As Long

arr(0) = Cells(1, 1).Value
arr(1) = Cells(1, 2).Value
arr(2) = Cells(1, 5).Value
arr(3) = Cells(1, 10).Value

  For i = 1 To 100

  Worksheets("sheet2").Cells(i).Value = arr(i)

    For j = 1 To 4
  
  
    Next j 


  Next i

End Sub
・ツリー全体表示

【81503】Re:グループ化されたオートシェイプの扱い
回答  マナ  - 20/10/6(火) 20:50 -

引用なし
パスワード
   ▼りった さん:

代わりに検索しました。試してはいません。
ht tps://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1442405939
・ツリー全体表示

【81502】グループ化されたオートシェイプの扱い
質問  りった  - 20/10/6(火) 18:54 -

引用なし
パスワード
   特定の条件に合うオートシェイプを探し、文言を微修正するマクロの作成をしています。
グループ化されている場合は、グループを解除せず、各オートシェイプについて条件判定と文言微修正をしたいのですが、どのようにすれば良いのか解りません。ご教示頂けないでしょうか?

Dim sp as Shape
for each sp in Sheet1.Shapes
if sp.Type = msoGroup Then
 ???
else
 if (特定の条件) then
  sp.TextFrame2.TextRange.Text = (変更後の文言)
endif
Next

尚、セル操作のマクロはかなり作ったことが有りますが、オートシェイプ操作については初Tryです。
・ツリー全体表示

【81501】Re:VBAでどのようにコードを書いたらいい...
お礼  mi  - 20/9/27(日) 16:27 -

引用なし
パスワード
   ごめんなさい素人な者で。最初にシート2A列に記載されてる計算式のみも同時に消したいと書いいたのですが。
A列にはすでに設置ずみのお客様固有番号(個人情報保護法)により設置されたお客様名は書けないのです。
シリアル番号もお客様番号も設置者も常に残っています。
正直文章で全てを伝えるって難しいですね。大変申し訳ありませんでした。
・ツリー全体表示

【81500】Re:VBAでどのようにコードを書いたらいい...
発言  γ  - 20/9/27(日) 15:52 -

引用なし
パスワード
   シート2のA列にはすでに""ではないシリアル番号が表示されているものがあるなら、
<>""だけでは判定できないですよ。
>A列に今回以外の何か値が残っていると、それも対象になるので注意)
と書いたとおりのことだったわけですね。

シート2の例に、シリアル番号が残っているケースも書いてもらうと間違いがなかった。
最初に、シート2のA列に値が表示されたら、
という質問だったのでそれに沿って回答しました。

フィルタオプションを使って、絞り込んだらどうですか?
マクロ記録をとって研究してみて下さい。
・ツリー全体表示

【81499】Re:VBAでどのようにコードを書いたらいい...
お礼  mi  - 20/9/27(日) 9:49 -

引用なし
パスワード
   お忙しい中回答して頂きありがとうございます。質問なのですがClearContentsならお客様番号が消えてしまいませんでしょうか?
計算式のみ消したいので、ClearContentsはつかえなくまた今現在の在庫数が1200台ありあと少なくとも1万台程増える予定なのでかなりの時間がかかり現実的ではなかったのであきらめます。設置者で田中をプルダウン方式にしwithをつかい
.valu=.valuでシンプルにして上手くいきましたのでその方式で管理しようかと。使う人はExcelじたい使えない人もいて信用も出来ない人ばかりなので一つずつ確実に確認していったほうがミスも少ないのでは?と皆さんの意見もあったので
・ツリー全体表示

【81498】Re:VBAでどのようにコードを書いたらいい...
発言  mi  - 20/9/26(土) 17:51 -

引用なし
パスワード
   ▼γ さん:
>シリアル番号の桁数が揃っていない(7桁,8桁)ことに気づくのに時間がかかりました。
>
>二つ載せます。
>test1はごく基本的なもの。行数によっては時間がかかるかもしれません。
>test2はオートフィルタを使ったもの。
>
>いずれもテストをしてから使って下さい。
>(こちらの環境ではOKでしたが、そちらの環境では不明です。色々ありますから。
> A列に今回以外の何か値が残っていると、それも対象になるので注意)
>
>Sub test1()
>  Dim rng As Range
>  Dim k As Long
>  With Worksheets("sheet2")
>    For k = 2 To .Cells(.Rows.count, "A").End(xlUp).Row
>      If .Cells(k, "A").Value <> "" Then
>        .Cells(k, "A").ClearContents
>        .Cells(k, "C").Value = "田中"
>      End If
>    Next
>  End With
>End Sub
>
>Sub test2()
>  Dim rng As Range, body As Range
>  
>  Set rng = Worksheets("Sheet2").Range("A1").CurrentRegion
>  Set body = Intersect(rng, rng.Offset(1))
>  
>  rng.AutoFilter Field:=1, Criteria1:="<>", Operator:=xlAnd
>  body.Columns(3).Value = "田中"
>  body.Columns(1).ClearContents
>  rng.AutoFilter
>End Sub
ありがとうございます。色々わかりにくく書いてしまいます申し訳ありません。
緊急がはいりこれから仕事なのでまたあとで確認してみます。
入力フォームは毎日clearにしてしようしますので機器シリアル番号番号のA列は常に残ったままです。機器は約12000台位ありこのシリアル番号の機器は0001というお客様宅に田中が取り付けに行ったという管理なのです。後々は日付も管理しますが始めたばかりでどれ位管理しないとだめなのか全く不明なのでとりあえず思いついた方法でやってみようかと。
・ツリー全体表示

【81497】Re:VBAでどのようにコードを書いたらいい...
回答  γ  - 20/9/26(土) 17:15 -

引用なし
パスワード
   シリアル番号の桁数が揃っていない(7桁,8桁)ことに気づくのに時間がかかりました。

二つ載せます。
test1はごく基本的なもの。行数によっては時間がかかるかもしれません。
test2はオートフィルタを使ったもの。

いずれもテストをしてから使って下さい。
(こちらの環境ではOKでしたが、そちらの環境では不明です。色々ありますから。
 A列に今回以外の何か値が残っていると、それも対象になるので注意)

Sub test1()
  Dim rng As Range
  Dim k As Long
  With Worksheets("sheet2")
    For k = 2 To .Cells(.Rows.count, "A").End(xlUp).Row
      If .Cells(k, "A").Value <> "" Then
        .Cells(k, "A").ClearContents
        .Cells(k, "C").Value = "田中"
      End If
    Next
  End With
End Sub

Sub test2()
  Dim rng As Range, body As Range
  
  Set rng = Worksheets("Sheet2").Range("A1").CurrentRegion
  Set body = Intersect(rng, rng.Offset(1))
  
  rng.AutoFilter Field:=1, Criteria1:="<>", Operator:=xlAnd
  body.Columns(3).Value = "田中"
  body.Columns(1).ClearContents
  rng.AutoFilter
End Sub
・ツリー全体表示

【81496】Re:VBAでどのようにコードを書いたらいい...
発言  mi  - 20/9/26(土) 15:07 -

引用なし
パスワード
   ▼γ さん:
>具体例で説明してください。
>   A列    B列
>1行
>2
>のような形式で、具体的な計算式も合わせて説明してもらうと
>回答も集まりやすいでしょう。
>また、唐突な"田中さん"の意味も併せて書いてください。
>
># それにしても、最初の質問からはまったく想像がつかない内容ですな。

 シート1(入力フォーム)      シート2(機器のシリアル番号)
 A列     B列          A列     B列    C列
お客様番号 シリアル番号     お客様番号 シリアル番号 機器交換者
0001    1134225               11134111
0002    1134227               11134112
                   0001    11134225   田中
                        11134226
                   0002    11134227   田中
シート2(機器のシリアル番号)のA列に計算式を入れておりシート1(入力フォーム)
のB列のシリアル番号を入力すると、シート2(機器のシリアル番号)に登録されてる
シリアル番号と一致した時A列に自動的反映されるようにしております。
シート2(機器のシリアル番号)に登録ボタンを作ってその登録ボタンを押すと
お客様管理番号が反映された所に機器交換者である田中という文字をいれたいのです。と同時に反映された所の計算式もその部分だけをけしたいのです。
わかりにくく申し訳ありませんでした。
上記でわかるでしょうか?
・ツリー全体表示

【81495】Re:VBAでどのようにコードを書いたらいい...
発言  γ  - 20/9/26(土) 12:28 -

引用なし
パスワード
   具体例で説明してください。
   A列    B列
1行
2
のような形式で、具体的な計算式も合わせて説明してもらうと
回答も集まりやすいでしょう。
また、唐突な"田中さん"の意味も併せて書いてください。

# それにしても、最初の質問からはまったく想像がつかない内容ですな。
・ツリー全体表示

【81494】Re:VBAでどのようにコードを書いたらいい...
発言  mi  - 20/9/26(土) 9:53 -

引用なし
パスワード
   実は在庫管理表を作っていてシート1が入力フォームでシート2がシリアル番号を入れているのですが、シート1のa列にお客様管理番号、b列にシリアル番号を入力すると、シート2のa列にindex,mach関数を入れていてシート1のb列と一致したシリアル番号の行のa列にお客様管理番号が表示されているのですが、シート2にボタンフォーム(登録ボタン)を作りその登録ボタンをクリックするとシート2のa列に表示された行のc列に田中さんと表示させたいのです。
sub ボタン1_click()の所にプログラムを書くと思うのですがどのように書けばいいのか悩んでいます。
出来れば同時にa列に入れてる関数も消してしまいたいのですが。
ややこしく申し訳ございませんがよろしくお願いいたします
・ツリー全体表示

【81493】Re:VBAでどのようにコードを書いたらいい...
発言  γ  - 20/9/26(土) 7:12 -

引用なし
パスワード
   一行目からA列の最終行までの各行で以下を繰り返す。
  A列に入力されていたら(cells(k,"A")<>"")
  C列に"田中さん"と入力 (cells(k,"C").Value="田中さん")
Next
というようなことかと思いますが、
どのあたりが不明ですか?
For .. Nextを使った繰り返しですか?
それとも最終行の取得ですか?
・ツリー全体表示

【81492】VBAでどのようにコードを書いたらいいの...
質問  mi  - 20/9/26(土) 1:55 -

引用なし
パスワード
   a列のどこかに(複数個)入力され登録ボタンを押すと自動的にその入力された行列のc列に田中さんと表示さすにはどのようにプログラムを書いたらよろしいのでしょうか?
VBA全くのド素人なのです。どうか宜しくお願いいたします
・ツリー全体表示

【81491】Re:引数で指定したセルだけをCalculateメ...
お礼  FTB  - 20/9/25(金) 19:46 -

引用なし
パスワード
   色々と細かなご配慮の数々、ご親切痛み入ります。

▼γ さん:
>チャレンジされるのは結構ですが、
>指摘済みのことを活かしてください。
>Rangeに対してCalculateメソッドを使うだけの話です。

→ 今回のご指摘で理解が進みました。
>
>なお、戻り値もないはずなのに
>func2 = Range(ans)
>としてみたり、Functionプロシージャに限らずマクロの基本から
>おさらいされることをお薦めします。

→ 戻り値は、デバッグ表示のためにでした。
  ご指摘通り、マクロの勉強を進めたいと存じます。
・ツリー全体表示

【81490】Re:引数で指定したセルだけをCalculateメ...
発言  γ  - 20/9/25(金) 11:46 -

引用なし
パスワード
   チャレンジされるのは結構ですが、
指摘済みのことを活かしてください。
Rangeに対してCalculateメソッドを使うだけの話です。

なお、戻り値もないはずなのに
func2 = Range(ans)
としてみたり、Functionプロシージャに限らずマクロの基本から
おさらいされることをお薦めします。
・ツリー全体表示

【81489】Re:引数で指定したセルだけをCalculateメ...
お礼  FTB  - 20/9/25(金) 8:48 -

引用なし
パスワード
   色々とご指摘ありがとうございます!!
マクロでチャレンジしてみようと思います。

▼γ さん:
>大事なことを言い忘れましたが、
>>=func2(b1)」や「=func2("b1")」など
>ユーザー定義関数の中ではCalculateメソッドは使えません。
>
>「Excel のユーザー定義関数の制限について」
>ht  tps://support.microsoft.com/ja-jp/help/170787/description-of-limitations-of-custom-functions-in-excel
>にあるように、ほとんどのメソッドは使用できません。
>(他のセルに影響を及ぼす副作用を避けるためです。)
・ツリー全体表示

【81488】Re:引数で指定したセルだけをCalculateメ...
回答  γ  - 20/9/24(木) 23:35 -

引用なし
パスワード
   大事なことを言い忘れましたが、
>=func2(b1)」や「=func2("b1")」など
ユーザー定義関数の中ではCalculateメソッドは使えません。

「Excel のユーザー定義関数の制限について」
ht  tps://support.microsoft.com/ja-jp/help/170787/description-of-limitations-of-custom-functions-in-excel
にあるように、ほとんどのメソッドは使用できません。
(他のセルに影響を及ぼす副作用を避けるためです。)
・ツリー全体表示

【81487】Re:引数で指定したセルだけをCalculateメ...
回答  γ  - 20/9/24(木) 23:05 -

引用なし
パスワード
   >▼γ さん:
>
>>ただ、これだけなので、Functionプロシージャにする意味もなさそうですが。
>
> → 1枚のシートの中に、同時に計算できない排他的な行が多数あるためFunctionにしたいと考えています。(チェックBoxで再計算したい行を指定)
>
 これはあとまわしにしましょう。 

>−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
>>ansがRange変数になっていますが、どこのセルか指定がないし、
>
> → Func2の引数にセル(B1等)を入力しています。
>  呼び方は「=func2(b1)」や「=func2("b1")」など、各種パターンを試してみましたが、症状は変わらずでした。

>=func2(b1)」や「=func2("b1")」など 
それは arg変数のことですよね。
私が言っているのは、あなたが宣言した ans 変数です。
Dim ans As Range
として、その後、どこのセルと指定することなく、直接、
 ans = ans & c.Text
などとしていますが、そういうことはできません。


>−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
>>For Each c In arg
>>  ans = ans & c.Text
>>Next c
>>は、ansは String型に変更すれば、
>>各セルに表示されているものを文字列として連結している
>>ということは理解されていますか?
>
> → これは、指定したセル(B1)を"B"+"1"とマージしていると理解していますが。

どうしたら、そういう理解になるのか説明していただけますか?

For Each c In arg
というのは、argというセル範囲の、各セル c について、以下を繰り返す、
という意味でしょう?

やりたいことは、指定したセル範囲arg を再計算するんだから、
端的に arg.Calculate
とすればよいだけじゃないんですか?
・ツリー全体表示

【81486】Re:引数で指定したセルだけをCalculateメ...
発言  FTB E-MAIL  - 20/9/24(木) 21:58 -

引用なし
パスワード
   御回答、ありがとうございます。

▼γ さん:

>ただ、これだけなので、Functionプロシージャにする意味もなさそうですが。

→ 1枚のシートの中に、同時に計算できない排他的な行が多数あるためFunctionにしたいと考えています。(チェックBoxで再計算したい行を指定)

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
>ansがRange変数になっていますが、どこのセルか指定がないし、

→ Func2の引数にセル(B1等)を入力しています。
  呼び方は「=func2(b1)」や「=func2("b1")」など、各種パターンを試してみましたが、症状は変わらずでした。
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
>For Each c In arg
>  ans = ans & c.Text
>Next c
>は、ansは String型に変更すれば、
>各セルに表示されているものを文字列として連結している
>ということは理解されていますか?

→ これは、指定したセル(B1)を"B"+"1"とマージしていると理解していますが。
・ツリー全体表示

【81485】Re:引数で指定したセルだけをCalculateメ...
発言  γ  - 20/9/24(木) 18:58 -

引用なし
パスワード
   Function func2(arg As Range)
  arg.Calculate
End Eunction
だけでよいのでは?
ただ、これだけなので、Functionプロシージャにする意味もなさそうですが。

なお、
ansがRange変数になっていますが、どこのセルか指定がないし、
For Each c In arg
  ans = ans & c.Text
Next c
は、ansは String型に変更すれば、
各セルに表示されているものを文字列として連結している
ということは理解されていますか?
いずれにしても、いろいろを再考すべきところが多いですね。
頑張って下さい。
・ツリー全体表示

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