Excel VBA質問箱 IV

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

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


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

【77479】参照渡しと値渡し
質問  Nobu10 E-MAIL  - 15/10/16(金) 2:05 -

引用なし
パスワード
   (〜渡し)と言えば渡すほうに主導権があると思います。他のプロシージャへ変数を受け渡しするとき呼出元でのステートメントの書き方は Call mySub (a)などの様に、どの渡しでも同じです。しかし呼出先プロシージャでは受ける変数の前にByRef又はByValと区別しています。つまり(〜渡し)は呼出元ではなく呼出先プロシージャの主導権によって決定されると言っていいのではないでしょうか。すれば(〜渡し)と言うより(〜受け)と言ったほうがよいのではないかと思います。しかし下記のプロシージャでは呼出先でByRefと参照渡しを指定しているのにかかわらず、値渡しになるようです。ここでは、Callステートメントを使用しないでmySub(a)と変数を()で括ると値渡しになり呼出元が主導権を握っています。言いたいことは、(〜渡し)は呼出元プロシージャによって決まるか呼出先プロシージャなのかと言うことです。
Sub Test()             Sub mySub(ByRef aa As String)
Dim a As String            aa="エクセル"
a="Excel"             End Sub
mySub(a)
MsgBox a
End Sub
どなたか説明できる方はよろしくお願いいたします。
・ツリー全体表示

【77478】Re:数値がプラスマイナスのとき、データ...
発言  β  - 15/10/15(木) 20:13 -

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

もう少しコードを整理して、ループによるコード圧縮もできますがとりあえず。

Sub Test()
  Dim wX As Variant
  Dim wY As Variant
  Dim wZ As Variant
  Dim dX As Variant
  Dim dY As Variant
  Dim dZ As Variant
  Dim v As Variant
  Dim n As Variant
  Dim x As Long
  
  ReDim v(1 To 2 * 2 * 2, 1 To 3)
  
  n = Range("X1").Value
  If Left(n, 1) = "±" Then
    ReDim wX(1 To 2)
    wX(1) = Mid(n, 2)
    wX(2) = Mid(n, 2) * -1
  Else
    ReDim wX(1 To 1)
    wX(1) = n
  End If
  
  n = Range("Y1").Value
  If Left(n, 1) = "±" Then
    ReDim wY(1 To 2)
    wY(1) = Mid(n, 2)
    wY(2) = Mid(n, 2) * -1
  Else
    ReDim wY(1 To 1)
    wY(1) = n
  End If
  
  n = Range("Z1").Value
  If Left(n, 1) = "±" Then
    ReDim wZ(1 To 2)
    wZ(1) = Mid(n, 2)
    wZ(2) = Mid(n, 2) * -1
  Else
    ReDim wZ(1 To 1)
    wZ(1) = n
  End If
  
  For Each dX In wX
    For Each dY In wY
      For Each dZ In wZ
        x = x + 1
        v(x, 1) = dX
        v(x, 2) = dY
        v(x, 3) = dZ
      Next
    Next
  Next
  
  Range("X1").Resize(UBound(v, 1), 3).Value = v
  
End Sub
・ツリー全体表示

【77477】数値がプラスマイナスのとき、データ増や...
質問  みか  - 15/10/15(木) 19:42 -

引用なし
パスワード
   みなさん、こんばんは。
vba初心者のため、上手く伝わるか分かりませんが、よろしくお願いします。

セルのデータが±で始まる時、データをプラスとマイナスに分けたデータに作りかえたいのです。

例1
  X  Y  Z
  ±50  ±40 ±5

の時、下記データに変換したいのです。

   X   Y  Z
   50   40   5
   50   40  -5
   50  -40   5
   50  -40  -5
  -50   40   5
  -50   40  -5
  -50  -40   5
  -50  -40  -5

例2
   X   Y   Z
   50  ±40  5

の時は下記のように、

   X   Y  Z
   50   40   5
   50  -40   5

loopでまわしてみたのですが、上手く行きませんでした。
参考程度でもよいのでヒントを下さい。
よろしくお願いします。
・ツリー全体表示

【77476】Re:セル内への文字入力
お礼  桃太郎  - 15/10/15(木) 18:25 -

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

>左辺のSelection は上記で説明した通りですが問題は【右辺】のSelection.
>ここが複合せルですね。複合セルということは複数セル領域です。

>左辺も右辺も配列であれば、転記はできますが、右辺が 配列に単一の値を付加したもの。
>こういった値は生成できません。
>このあたり、ややこしいかもしれませんが、右辺を【単一の値】にする必要があります。


大変わかりやすい説明ありがとうございます。
何が問題なのか、非常によくわかりました。


>Selection.Value = Selection(1).Value & Cells(21, 17).Value
>にしてください。

これで解決できました。ありがとうございます。
Selection(1).Valueで結合セルの最初のセルの値だけ取り出せるわけですね。
こういうのはスキルが低いのかググってもたどりつけないので非常に助かります。


>ところで、Cells(21, 17).Value これって、わかりにくくないですか?
>Range("Q21").Value のほうがわかりやすくないですか?

以前はRangeで書いてましたが、変数を使いたい場合、
Range表現だと非常にややこしい形でないと変数が使えなかったので
以降Cellsで書いています。

前回に続き今回もわかりやすい解説とコード、感謝させていただきます。
ありがとうございました。
・ツリー全体表示

【77475】Re:セル内への文字入力
発言  β  - 15/10/15(木) 17:49 -

引用なし
パスワード
   ▼桃太郎 さん:

Selection.Value = "hoge"

Slectionが結合セルであろうとなかろうと、このコードは 左辺のSelection のすべてのセルに右辺の値が代入されます。
で、Selectionが結合セルの場合は、結果的に、Selectionの先頭セル(結合セルの代表セル)以外の値は空白にされるということです。
結合セルではない、通常の複数セル領域を選択して試してみてください。

それは、さておき、今回の質問ですが、

Selection.Value = Selection.Value & Cells(21, 17).Value

左辺のSelection は上記で説明した通りですが問題は【右辺】のSelection.
ここが複合せルですね。複合セルということは複数セル領域です。

たとえば、 MsgBox Range("A1:A2").Value & "hoge"

こんなコードを実行するとエラーになります。
複数セル領域のValue は 1つの値ではなく【配列】になった値です。
左辺も右辺も配列であれば、転記はできますが、右辺が 配列に単一の値を付加したもの。
こういった値は生成できません。

このあたり、ややこしいかもしれませんが、右辺を【単一の値】にする必要があります。

Selection.Value = Selection(1).Value & Cells(21, 17).Value

にしてください。

ところで、Cells(21, 17).Value これって、わかりにくくないですか?
Range("Q21").Value のほうがわかりやすくないですか?
・ツリー全体表示

【77474】Re:セル内への文字入力
質問  桃太郎  - 15/10/15(木) 16:31 -

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

申し訳ありません。未熟なため、質問内容自体に私の勘違いがありました。

元に書いたコードでも結合セルに文字入力は出来ました。

デバックを要求されたのは、そこから改良しようと思ったコード自体に誤りがあるようです。

Selection.Value = Selection.Value & Cells(21, 17).Value

これは選択したセルの内容を残しつつ、そこからさらにCells(21, 17)の文字を
書き込めるようにしたつもりですが、この構文が間違っているようです。

再度申し訳ありませんがご指導ください。
・ツリー全体表示

【77473】Re:セル内への文字入力
発言  β  - 15/10/15(木) 7:38 -

引用なし
パスワード
   ▼桃太郎 さん:

結合セルも考慮するなら

Selection(1).Value = Cells(3, 2).Value

としてください。
・ツリー全体表示

【77472】セル内への文字入力
質問  桃太郎  - 15/10/15(木) 3:45 -

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


選んだセルに、特定セルに書かれている文字を入力するというマクロを使っており
重宝しております。例えば

Selection.Value = Cells(3, 2).Value


というコードですが、これだと結合セルにはうまく行かずデバックを要求されました。

どうすればいいか教えていただければ幸いです。
・ツリー全体表示

【77471】Re:VBAのロックについて
発言  β  - 15/10/14(水) 15:53 -

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

このサイトの上のほうに こちら をご一読ください。 という記述があります。
その こちら をクリックして、その中の マルチポストに関する、この掲示板のポリーシーを熟読願います。

この掲示板ではマルチポストを禁止してはいませんが、その際のマナーは守りましょう。
・ツリー全体表示

【77470】VBAのロックについて
質問  ゆう E-MAIL  - 15/10/14(水) 14:28 -

引用なし
パスワード
   エクセルファイルを配布時にマクロの記述を見られてくありません。

通常は、VBAの「ツール」-「プロパティ」で『プロジェクトを表示用にロックする』でパスワードをかけるかと思いますが、
解除ツール等が出まわっています。

そこで、パスワード入力画面も出さずに「プロジェクトがロックされています」「プロジェクトを表示出来ません」という様にするには
・ツリー全体表示

【77469】Re:ちょっと原因がわかりました
お礼  桃太郎  - 15/10/14(水) 3:02 -

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


>Set rngCurrent = Range("E4:AI40") に変更。

表は37行目までだったので("E4:AI37")にして、全て解決しました。
一部参照本見てもよくわからないコードなので助かりました。

とてもとても感謝いたします。
・ツリー全体表示

【77468】Re:ちょっと原因がわかりました
発言  β  - 15/10/14(水) 0:39 -

引用なし
パスワード
   ▼桃太郎 さん:

Set rngCurrent = Range("D4:AH32") これを
Set rngCurrent = Range("E4:AI40") に変更。

chk = Cells(40, col.Column).Value これを
chk = Cells(45, col.Column).Value に変更。


>内部は縦も横も書式設定でなしの下に出てくる細かい点線でした。

元のコードには、横の点線をセットするコードは、無いと思うんですが?
もし、セットするなら、

  '土日枠

このコメントの前あたりに

  '領域内部に横 HairLine
  With rngCurrent.Borders(xlInsideHorizontal)
    .LineStyle = xlContinuous
    .ColorIndex = xlAutomatic
    .TintAndShade = 0
    .Weight = xlHairline
  End With

を追加してみてください。
・ツリー全体表示

【77467】ちょっと原因がわかりました
発言  桃太郎  - 15/10/13(火) 20:54 -

引用なし
パスワード
   7年も経って昔の事がわからなくなっていました。

40行目に罫線作戦用のWEEKDAY関数が置いてありました。
何故そんな所に作ったのか忘れてしまいましたが、
昔もセル行を増やして、困ってあれこれした覚えがあります。

しかし今は何で40行目なのかわからなくなってしまいました。

今回の行を増やしたことにより罫線作成のためのと記してある
行は45行目に移動していました。

とすると元のコードのその部分を変更すればよいのでしょうか?

しかし私にはコードのどこが該当してどう直せばよいのかわかりません。
申しわけありませんが、そこの部分を教えてください。

βさんのコードも動きませんでした。これも45行目判定になったせいだと思われます。
・ツリー全体表示

【77466】遅くなりましてすいません
発言  桃太郎  - 15/10/13(火) 20:36 -

引用なし
パスワード
   また説明不足で申し訳ありません。

対象領域はE4からAI40です

土日の判定はどうしているのか、コードからわからなかったのですが

E4〜AI4 まではDATE関数により1日から31日まで表示されます。
E5〜AI5 まではWEEKDAY関数が置いてあり4行目のシリアルから曜日が表示
されるようにしてあります。

罫線は上下の端のみ普通の細線、内部は縦も横も書式設定でなしの下に出てくる
細かい点線でした。

βさんのコードためさせていただきますね
・ツリー全体表示

【77465】Re:セルの内容をテキスト化するマクロの...
お礼  SHO  - 15/10/13(火) 11:46 -

引用なし
パスワード
   ウッシーさん

はい!こちらで大丈夫です。

上のスレッドでも書いてしまいました。
申し訳ないです。

今回はありがとうございました!
自分で書けるようにがんばります!
・ツリー全体表示

【77464】Re:セルの内容をテキスト化するマクロの...
回答  ウッシ  - 15/10/13(火) 11:44 -

引用なし
パスワード
   >日付のセルの出力もスペースと矢印を先頭に追加する処理が欲しいです。

- 15/10/13(火) 11:26 - のコードがそうなっているはずです、多分・・・
・ツリー全体表示

【77463】Re:セルの内容をテキスト化するマクロの...
回答  SHO  - 15/10/13(火) 11:40 -

引用なし
パスワード
   ウッシーさん

ソースを作っていただいたもの気づくのが遅くなりましてすみません。

全然遅くなっておりません。
感動しました!ありがとうございます。

作っていただいて申し訳ないのですが、
日付のセルの出力もスペースと矢印を先頭に追加する処理が欲しいです。
依頼の内容に不足があり申し訳ありません。

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

【77462】Re:セルの内容をテキスト化するマクロの...
回答  ウッシ  - 15/10/13(火) 11:26 -

引用なし
パスワード
   >はい、9行目の要望は2つです。

という事は

  Do Until GYO > GYOMAX
    strREC = Cells(GYO, 7).Value & _
      IIf(Cells(GYO, 8).Value <> "", " ・" & Cells(GYO, 8).Value, "") & _
      IIf(IsDate(Cells(GYO, 9).Value), " →" & Format(Cells(GYO, 9).Value, "m/d(aaa)"), _
        IIf(Cells(GYO, 9).Value <> "", " →" & Cells(GYO, 9).Value, "")) & _
      Cells(GYO, 10).Value
    lngREC = lngREC + 1
    xlAPP.StatusBar = "出力中です....(" & lngREC & "レコード目)"
    ' レコードを出力
    Print #intFF, strREC
    GYO = GYO + 1
  Loop

こっちですか?
・ツリー全体表示

【77461】Re:セルの内容をテキスト化するマクロの...
回答  SHO  - 15/10/13(火) 11:10 -

引用なし
パスワード
   ▼ウッシ さん:

こんにちは
レスありがとうございます。

はい、9行目の要望は2つです。
説明足りず申し訳ないです。
よろしくお願いします。
・ツリー全体表示

【77460】Re:セルの内容をテキスト化するマクロの...
回答  ウッシ  - 15/10/13(火) 10:58 -

引用なし
パスワード
   こんにちは

遅くなる可能性大ですが、

  Do Until GYO > GYOMAX
    strREC = Cells(GYO, 7).Value & _
      IIf(Cells(GYO, 8).Value <> "", " ・" & Cells(GYO, 8).Value, "") & _
      IIf(IsDate(Cells(GYO, 9).Value), Format(Cells(GYO, 9).Value, "m/d(aaa)"), _
        IIf(Cells(GYO, 9).Value <> "", " →" & Cells(GYO, 9).Value, "")) & _
      Cells(GYO, 10).Value
    lngREC = lngREC + 1
    xlAPP.StatusBar = "出力中です....(" & lngREC & "レコード目)"
    ' レコードを出力
    Print #intFF, strREC
    GYO = GYO + 1
  Loop

こんな方法も。
・ツリー全体表示

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