Excel VBA質問箱 IV

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

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


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

【79766】縦に長いデータにしたい
質問  はやしはる  - 18/4/5(木) 23:16 -

引用なし
パスワード
   このようなデータがあります。

出席番号 国語 社会 算数 理科
1 62 27 48 73
2 90 94 86 95
3 75 64 48 45
4 68 55 75 66
5 85 82 92 90
6 77 45 50 70
7 65 36 26 48

下に示すように縦に長いデータに変換する方法をVBAでチャレンジしているのですが、効率よく書けません。
出席番号と各科目のデータを5シートに作って縦に結合するということをしています。

みなさんならばどのようにされますでしょうか?


出席番号 科目 得点
1 国語 62
2 国語 90
3 国語 75
4 国語 68
5 国語 85
6 国語 77
7 国語 65
1 社会 27
2 社会 94
3 社会 64
4 社会 55
5 社会 82
6 社会 45
7 社会 36
1 算数 48
2 算数 86
3 算数 48
4 算数 75
5 算数 92
6 算数 50
7 算数 26
1 理科 73
2 理科 95
3 理科 45
4 理科 66
5 理科 90
6 理科 70
7 理科 48

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

【79765】Re:セル値によってオートシェイプの表示...
発言  γ  - 18/4/5(木) 20:46 -

引用なし
パスワード
   Sub 入力()
Private Sub Worksheet_Change(ByVal Target As Range)
というのはどうしてですか?
・ツリー全体表示

【79764】Re:セル値によってオートシェイプの表示...
発言  マナ  - 18/4/5(木) 19:10 -

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

>オートシェイプの名前は、四角1.です。

"."が最後につくので間違いないですか

>C14に【True・False】のどちらかを表示させて

C14が、数式が入ったセル、ということはありませんか
・ツリー全体表示

【79763】Re:セル値によってオートシェイプの表示...
発言  亀マスター  - 18/4/5(木) 18:41 -

引用なし
パスワード
   うまくいかないないとは、具体的にどのような状態でしょうか。
エラーが発生するのか?動作は完了するが思っていたのと違う結果なのか?

エラーが発生するのであれば、発生した箇所とエラーメッセージを、
思っていたのと違う結果なら、期待する結果と実際の結果を示した方が
回答がしやすいですよ。

とりあえず、いくつか切り分けて解明していきましょう。

Target.Addressの値が狙ったものになっているか
Range("C14").Valueの値が狙ったものになっているか
"四角1"というオートシェイプはちゃんと存在しているか
動かそうとしているオートシェイプは本当に"四角1"という名前か
直接"四角1"のVisibleプロパティを操作するとどうなるか

このあたりを確認してみてはどうでしょうか。
・ツリー全体表示

【79762】セル値によってオートシェイプの表示非表...
質問  Kazu  - 18/4/5(木) 16:47 -

引用なし
パスワード
   初めまして。
題名の件で、以下のVBAを作成してみました。
が、上手く動作しません。
どこが間違ってるのか、教えていただけますと幸いです。

セル番号 C14に【True・False】のどちらかを表示させて
Trueなら表示、Falseなら非表示としたいです。

オートシェイプの名前は、四角1.です。

Sub 入力()

Private Sub Worksheet_Change(ByVal Target As Range)

  If Target.Address = "$C$14" Then
    
    Select Case Range("C14").Value
      
      Case "True"
        ActiveSheet.Shapes("四角1.").Visible = True
      
      Case "False"
        ActiveSheet.Shapes("四角1.").Visible = False
    
    End Select
  
  End If
  
End Sub

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

【79761】Re:入力のある項目をすべて書き出したい
お礼  pen  - 18/4/3(火) 9:40 -

引用なし
パスワード
   hatena様

ありがとうございます。
昨夜頑張ってループ作成試みていたのですが、項目をどう持って来ていいかわからず、
改めて質問に追加しようと思っていたところでした。

勉強になりました。
配列を使ったことがなかったので、
参考にさせていただき、頑張ってみようと思います。
ありがとうございました。
・ツリー全体表示

【79760】Re:入力のある項目をすべて書き出したい
回答  hatena  - 18/4/3(火) 9:18 -

引用なし
パスワード
   単純な処理なので、二重ループでシンプルに記述できると思います。

私なら、高速化も兼ねて、シート1のデータを配列に格納して、
配列にレイアウト変更して出力し、
それをシート2に書き出す、という方法をとりますね。

Public Sub Test()
  Dim S1() As Variant, S2() As Variant
  Dim i As Long, j As Long, r As Long
  
  S1 = Sheet1.Range("A6").CurrentRegion.Value '表データを配列に格納
  ReDim S2(1 To (UBound(S1) - 1) * (UBound(S1, 2) - 3), 1 To 3) '出力用配列のサイズを確保
  
  For i = 2 To UBound(S1)
    For j = 2 To UBound(S1, 2)
      If S1(i, j) <> "" Then
        r = r + 1
        S2(r, 1) = S1(i, 1)
        S2(r, 2) = S1(1, j)
        S2(r, 3) = S1(i, j)
      End If
    Next
  Next
  
  Sheet2.Range("A1").Resize(r, 3).Value = S2
End Sub
・ツリー全体表示

【79759】入力のある項目をすべて書き出したい
質問  pen  - 18/4/2(月) 23:39 -

引用なし
パスワード
   初心者ですが、宜しくお願いします。
あるフォーマットを作成中です。
シート1にユーザーが入力し、シート2で管理者が処理をする形になっています。
シート1の中段に表があり、その表の内容をシート2にリストの形で書き出しする処理を、
自動処理させたいと思っています。

表の中は、ランダムに必要な個所のみが入力されている状態です。
*縦は必ず上から順に入り、3を飛ばして4に入力ありということはありません。
 横は、下表のようにランダムでBを飛ばしてCに入力などあります。

シート1には
No A B C D E F G H I J
1 あ       い
2 う  え  お
3      か    き
4
5
6

の、ように縦に1〜6、横にA〜Jの項目があり、
入力も場合によっては、1Aのみだったりと入力数もバラバラです。

書き出し後は、シート2に
1 A あ
1 F い
2 A う
2 C え
2 E お

の形で、セルを分けてNo縦、No横、入力内容の順に表示させたいです。

1Aから順にループ処理で行う方法を検討していますが、
他に簡単に(処理数を少なくといいましょうか)出来る方法やアイデアがあれば教えて頂きたいです。
(まだ実際にはコードを書いていなくて、処理方法を検討している所です)

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

【79758】Re:コンボボックスのリスト表示について
お礼  VICH  - 18/4/1(日) 22:27 -

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

自己解決しました。
コンボボックスのプロパティのRow sourceに
Sheet9!A2:A6と入力していたのですが、
これを削除したら問題なくマクロが作動しました。

回答ありがとうございました。
・ツリー全体表示

【79757】Re:コンボボックスのリスト表示について
質問  VICH  - 18/3/31(土) 18:04 -

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

返事が遅くなり申し訳ありません。
回答していただきありがとうございます。また、間違いの修正とアドバイスもいただき、まことにありがとうございます。

For Nextがなにも処理しなかったとのことですが、Sheet9のセルA2:A6に入力された内容をユーザーフォームに設置したコンボボックスに表示させることができたのはなぜなのでしょうか。試しに以下のコードを記述し、実行してみたのですが、エラーとなりました。

Private Sub UserForm_Initialize()
 ComboBox01.AddItem Sheet9.Cells(2, 1).Value
End Sub

つまり、For Nextが何らかの処理を行ったことで、Sheet9のセルA2:A6に入力された内容をコンボボックスに表示させることができたのだと思うのですが、何か上記コードに不備があるということでしょうか。

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

【79756】Re:リッチで押し込めるボタン
発言  でれすけ  - 18/3/30(金) 16:31 -

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

 Sheet1.CommandButton1.Picture = LoadPicture(BMPFilePATH)

コマンドボタンに画像をのっけられますが、
そういうことではないのかな?
・ツリー全体表示

【79755】Re:マスターファイルを更新させない方法
発言  hatena E-MAIL  - 18/3/30(金) 14:40 -

引用なし
パスワード
   >普通の状況であれば、おっしゃる通りの対応をします。
>ですが、PC操作を解っていない(解ろうとしない?)人が多いので、
>フォーマットを変更したいときに、読み取り専用にしたフォルダに
>アップ出来なくて困りそうです。
>下手すると、勝手に別フォルダを作られて、どっちが最新だかわからない
>事態になりそうです。

それぞれの事情があるのでしょうが、
ある程度、ユーザーの権限を制御しないと、
取り返しのつかないことになりそうです。

自分なら下記のような運用にします。

上書きされたくないファイルは、読み取り専用のフォルダーにおく。
クライアントにショートカットを置いておく。
ファイルをアップする必要があるなら、それ用のフォルダーを作成する。

そちらの事情がわからないので、これ以上アドバイスしても無駄なようですのでこれで終わりにします。
・ツリー全体表示

【79754】Re:コンボボックスのリスト表示について
回答  りった  - 18/3/30(金) 14:12 -

引用なし
パスワード
   ▼VICH さん:
>初めて投稿させていただきます。
>vbaを始めたばかりで分からない箇所がありましたので質問させていただきます。
>
>Sheet9のセルA2:A6に入力された内容をユーザーフォームに設置したコンボボックスに表示させたいと思っております。
>また、今後のため、新たに追加されたデータにも対応できるようにしたいです。
>そこで、以下のようなコードを記述しました。
>
>Private Sub UserForm_Initialize()
>  Dim i As Long
>  Dim LastRow As Long
>  LastRow = Sheet9.Cells(Rows.Count, 1).End(xlUp).Row
>    For i = 2 To LastRow
>     ComboBox01.AddItem Sheet9.Cells(i, 0).Value
>    Next i
> End Sub
>
>しかし、これを実行すると下記のエラーが発生しました。
>「実行時エラー '1004':アプリケーション定期またはオブジェクトの定義エラーです」

⇒ 誤: Cells(i, 0) 正:Cells(i, 1)


>また、一度間違えて上記コードの4行目(LastRow = Sheet9.Cells(Rows.Count, 1).End(xlUp).Row)を抜いて実行してしまった時があったのですが、なぜかうまくいきました。
>さらに、この現象を検証するため、以下のようなコードを記述したのですが、結果としてうまく実行されました。

⇒ うまく実行されたというより、何もしなかっただけかと思われます。

>
>Private Sub UserForm_Initialize()
>  Dim i As Long
>    For i = 2 To 0
>     ComboBox01.AddItem Sheet9.Cells(i, 1).Value
>    Next i
> End Sub
>
>そこで、質問なのですが、一つ目のコードから4行目(LastRow = Sheet9.Cells(Rows.Count, 1).End(xlUp).Row)を抜いてしまうと、変数LastRowには何も値が格納されないはずだと思うのですが、なぜうまくいったのでしょうか。

⇒ 「For i = 2 To 0」の意味は、
  「最初iに2を入れなさい。iが0以下だったら下記の処理を繰り返しなさい。」
  だから、一回も処理しなかったものと思います。

>また、二つ目のコードのFor Next文で初期値2で、1ずつカウントアップされて繰り返されるはずにもかかわらず、最終値が0でうまくいくのはなぜなのでしょうか。
>
>よろしくお願いいたします。

尚、質問とは異なりますが、「Rows.Count」と書くのは事故の元なので、Sheet9.Rows.Count」等と、シート名を書いた方が良いかと思います。
・ツリー全体表示

【79753】Re:マスターファイルを更新させない方法
お礼  りった  - 18/3/30(金) 13:45 -

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

普通の状況であれば、おっしゃる通りの対応をします。
ですが、PC操作を解っていない(解ろうとしない?)人が多いので、
フォーマットを変更したいときに、読み取り専用にしたフォルダに
アップ出来なくて困りそうです。
下手すると、勝手に別フォルダを作られて、どっちが最新だかわからない
事態になりそうです。

どちらの対処も一長一短なんですけど。。。
・ツリー全体表示

【79752】Re:マスターファイルを更新させない方法
回答  hatena  - 18/3/30(金) 10:18 -

引用なし
パスワード
   なんか、誤解しているようです。

サーバー側で、共有ユーザーのアクセス制限を設定するということです。

サーバー側に共有ユーザーに読み取りのみ許可のフォルダーを作成して、
そこにファイルを置くということです。

そうすると、クライアントから直接ファイルを開いても、上書き保存はできずに、名前を付けて保存しかできません。
あるいは、クライアントへコピーしてから開けば、編集可能になります。

どちらにしても、サーバー側のファイルがクライアントから変更されることはないです。

例えば、windows10なら、下記のリンク先の後半部分に、
「アクセス許可の設定」画面の説明がありますが、
そこで、「読み取り」のみ許可するよう設定します。

windows10でフォルダなどのファイルを共有する設定方法 | windows操作
//windows-sousa.com/2016/10/19/post-2902/
・ツリー全体表示

【79751】Re:リッチで押し込めるボタン
お礼  りった  - 18/3/30(金) 9:35 -

引用なし
パスワード
   改めてやってみると、「ボタン押したいのにオートシェイプを選択してしまう」問題が発生しませんでした。
新しく作ったオートシェイプボタンにマクロを移植しようとした際に失敗して、マクロ無しボタンになっていたのかもしれません。(赤っ恥)
まだ試してないですけど、オートシェイプボタンに凹んだ演出を自作するのが良さそうですね。
もうキャプチャー取って操作説明書いて渡してしまったんで、今回は作成しませんが、次回トライしてみます。

私の質問の仕方も色々問題あるかとは思いますが、気持ちよく交流出来る場にしていきたいとは思っているので、今後ともよろしくお願いします。
・ツリー全体表示

【79750】コンボボックスのリスト表示について
質問  VICH  - 18/3/30(金) 8:31 -

引用なし
パスワード
   初めて投稿させていただきます。
vbaを始めたばかりで分からない箇所がありましたので質問させていただきます。

Sheet9のセルA2:A6に入力された内容をユーザーフォームに設置したコンボボックスに表示させたいと思っております。
また、今後のため、新たに追加されたデータにも対応できるようにしたいです。
そこで、以下のようなコードを記述しました。

Private Sub UserForm_Initialize()
  Dim i As Long
  Dim LastRow As Long
  LastRow = Sheet9.Cells(Rows.Count, 1).End(xlUp).Row
    For i = 2 To LastRow
     ComboBox01.AddItem Sheet9.Cells(i, 0).Value
    Next i
End Sub

しかし、これを実行すると下記のエラーが発生しました。
「実行時エラー '1004':アプリケーション定期またはオブジェクトの定義エラーです」
また、一度間違えて上記コードの4行目(LastRow = Sheet9.Cells(Rows.Count, 1).End(xlUp).Row)を抜いて実行してしまった時があったのですが、なぜかうまくいきました。
さらに、この現象を検証するため、以下のようなコードを記述したのですが、結果としてうまく実行されました。

Private Sub UserForm_Initialize()
  Dim i As Long
    For i = 2 To 0
     ComboBox01.AddItem Sheet9.Cells(i, 1).Value
    Next i
End Sub

そこで、質問なのですが、一つ目のコードから4行目(LastRow = Sheet9.Cells(Rows.Count, 1).End(xlUp).Row)を抜いてしまうと、変数LastRowには何も値が格納されないはずだと思うのですが、なぜうまくいったのでしょうか。
また、二つ目のコードのFor Next文で初期値2で、1ずつカウントアップされて繰り返されるはずにもかかわらず、最終値が0でうまくいくのはなぜなのでしょうか。

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

【79749】Re:CopyFile
発言  γ  - 18/3/29(木) 21:23 -

引用なし
パスワード
   自己解決されたのなら なにより。
次回質問するときには、VBEのコードをそのままコピーペイストすることを
すすめます。

Call Fso.CopyFile(コピー元,C:\test1\)
C:\test1\は文字列ですから、"C:\test1\"とする必要がありますし、
Set Fob = Fso.GetFile(C:\test2\g2.txt, C:\test2\g3.txt)
もエラーです。引数を二つとることはできません。

タイプミスは、質疑の邪魔になるだけです。
基本的には、そのままコピーペイストしてください。
もちろん、固有名詞は適当に変更してかまいません。
・ツリー全体表示

【79748】Re:別シートにコピー
お礼  ノンボ  - 18/3/29(木) 20:40 -

引用なし
パスワード
   ▼γ さん:
>確認していませんが、それだとkはいつも同じなので、
>うまく転記できていないと思いますが。
>
>そっくりは使えませんが、考え方を参考にして下さい。
>Sub test()
>  Dim i As Long
>  Dim k As Long
>  
>  k = 1
>  For i = 1 To 100 Step 5
>    Cells(i, 1).Resize(5, 1).Copy Cells(k, 2)
>    k = k + 7
>  Next
>End Sub
さっそくご返答いただきましてありがとうございました。参考にして、試しましたらうまくいきました。大変ありがとうございました。
・ツリー全体表示

【79747】Re:リッチで押し込めるボタン
発言  emanon  - 18/3/29(木) 17:47 -

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

誰がどんな質問してもいいんじゃないの?
答えたい人は答えるし・・・
あなたがとやかく言うことではない。
あなたの他の投稿も不愉快なものが多いです。
・ツリー全体表示

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