如何設定,能在excel點選某一格時,自動將那格的行列都自動反白?

在 Excel 中,若你希望「點選某一格時,該格所在的整列與整欄都自動反白(例如變色)」,可以透過 條件格式 + VBA 來實現這個功能。以下是完整做法: ✅ 步驟一:打開 VBA 編輯器 按下 Alt + F11 開啟 VBA 編輯器。 在左側「工作簿名稱」下,雙擊你要設定的工作表(例如 Sheet1)。 ✅ 步驟二:貼上以下程式碼 vba Private Sub Worksheet_SelectionChange(ByVal Target As Range) Cells.FormatConditions.Delete ' 先清除所有條件格式 With Cells.FormatConditions.Add(Type:=xlExpression, _ Formula1:="=OR(CELL(""row"")=ROW(), CELL(""col"")=COLUMN())") .Interior.Color = RGB(255, 255, 153) ' 淡黃色,可改成你要的顏色 End With Me.Calculate ' 強制重算,讓格式生效 End Sub ✅ 功能說明: 每次你點選不同儲存格時,該列與該欄會套上「淡黃色」背景色。 CELL("row")=ROW():代表該列是選取儲存格的列。 CELL("col")=COLUMN():代表該欄是選取儲存格的欄。 ✅ 補充說明 若你想改變顏色,可調整這行: vba 複製 編輯 .Interior.Color = RGB(255, 255, 153) 例如改為藍色 RGB(173, 216, 230),或其他自訂顏色。 這個設定只影響當前工作表,其他表格若要一樣功能,需要也貼上相同程式碼。

為何出現此錯誤訊息?Use the existing version catalog reference (libs.google.play.app.update) instead

 

📌 錯誤原因

你的 build.gradle.kts 檔案(Kotlin DSL)可能使用了 版本目錄(Version Catalogs),所以無法直接使用:

kotlin
implementation("com.google.android.play:app-update:2.1.0") implementation("com.google.android.play:app-update-ktx:2.1.0")

🔹 Gradle 提示你應該使用 libs.google.play.app.update 這類的 版本目錄引用方式


🛠 解決方案

🔹 方法 1:改用 libs 版本目錄

如果你的專案 已啟用 libs.versions.toml 來管理依賴,請改成:

kotlin
implementation(libs.google.play.app.update) implementation(libs.google.play.app.update.ktx)

✅ 這樣可以確保依賴是從 gradle/libs.versions.toml 管理的。


🔹 方法 2:手動新增 libs.versions.toml 設定

如果你沒有 libs.versions.toml,但希望使用版本目錄,可以這樣做:

  1. 打開 gradle/libs.versions.toml(如果沒有,請自行建立)。

  2. 新增 Play Core Library 的依賴

    toml
    [versions] google-play = "2.1.0" [libraries] google-play-app-update = { module = "com.google.android.play:app-update", version.ref = "google-play" } google-play-app-update-ktx = { module = "com.google.android.play:app-update-ktx", version.ref = "google-play" }
  3. 然後在 build.gradle.kts 使用

    kotlin
    implementation(libs.google.play.app.update) implementation(libs.google.play.app.update.ktx)

🔹 方法 3:關閉版本目錄,直接使用原本的 implementation

如果你不想使用 版本目錄,你可以手動關閉這個功能,在 settings.gradle.kts 移除:

kotlin
enableFeaturePreview("VERSION_CATALOGS")

然後就可以直接使用:

kotlin
implementation("com.google.android.play:app-update:2.1.0") implementation("com.google.android.play:app-update-ktx:2.1.0")

注意:這樣做可能不符合 Gradle 的推薦設定,長遠來看不建議這樣處理。


🔹 結論

最佳做法:如果你的專案已經啟用了 libs.versions.toml,應該使用 方法 1 或 2
⚠ 如果你想繼續使用傳統 implementation("xxx"),則可以 使用方法 3 來關閉版本目錄功能。

為何出現此錯誤訊息?Call requires API level 23 (current min is 21): android.app.AlarmManager#setAndAllowWhileIdle

 你的 minSdkVersion 設定為 21 (Android 5.0 Lollipop),但 setAndAllowWhileIdle() 需要 API 23 (Android 6.0 Marshmallow),因此編譯時會報錯。


解決方法

1. 加入 API 檢查 (Build.VERSION.SDK_INT)

你可以加上條件判斷,讓 API 23 以上 使用 setAndAllowWhileIdle(),而 API 21-22 則使用 setExact()

kotlin
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // API 23+ alarmManager.setAndAllowWhileIdle( AlarmManager.RTC_WAKEUP, triggerTime, pendingIntent ) } else { // API 21-22 alarmManager.setExact( AlarmManager.RTC_WAKEUP, triggerTime, pendingIntent ) }

🔹 這樣可以確保 低於 API 23 的裝置仍然可以執行鬧鐘


2. (可選) 提高 minSdkVersion 至 23

如果你的應用 不需要支援 Android 5 (Lollipop),可以直接在 build.gradle 修改 minSdkVersion

gradle
android { defaultConfig { minSdkVersion 23 // 提高最低版本至 Android 6.0 } }

🔹 這樣就可以直接使用 setAndAllowWhileIdle(),不需要額外的 API 檢查。


最佳解法

如果你 希望支援 API 21 (Android 5)又要在 API 23 以上降低耗電,建議這樣寫:

kotlin
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { // Android 12+ 需要特別權限 val alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager if (!alarmManager.canScheduleExactAlarms()) { val intent = Intent(Settings.ACTION_REQUEST_SCHEDULE_EXACT_ALARM) startActivity(intent) } } val alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // API 23+ alarmManager.setAndAllowWhileIdle( AlarmManager.RTC_WAKEUP, triggerTime, pendingIntent ) } else { // API 21-22 alarmManager.setExact( AlarmManager.RTC_WAKEUP, triggerTime, pendingIntent ) }

🔹 這樣可以:

  • API 21-22:使用 setExact(),保證準時執行

  • API 23+:使用 setAndAllowWhileIdle(),允許低耗電模式

  • API 31+ (Android 12+):自動請求 SCHEDULE_EXACT_ALARM 權限

這樣你的鬧鐘就能在 各個 Android 版本 上正常運作 🎯

為何出現此錯誤訊息?Setting Exact alarms with setExact requires the SCHEDULE_EXACT_ALARM permission or power exemption from user; it is intended for applications where the user knowingly schedules actions to happen at a precise time such as alarms, clocks, calendars, etc. Check out the javadoc on this permission to make sure your use case is valid.

 你的 setExact() 需要 SCHEDULE_EXACT_ALARM 權限,因為 Android 12 (API 31) 之後,精確鬧鐘 (Exact Alarm) 需要特別授權。你可以用以下方式解決這個錯誤。


解決方案

1. 在 AndroidManifest.xml 內加入 SCHEDULE_EXACT_ALARM 權限

AndroidManifest.xml 檔案內加入:

xml
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM"/>

🔹 這允許應用使用 精確鬧鐘,但 Android 12+ 仍需要使用者手動授權


2. 確保使用者已授權 SCHEDULE_EXACT_ALARM

MainActivityApplication 啟動時檢查:

kotlin
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { // Android 12+ val alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager if (!alarmManager.canScheduleExactAlarms()) { val intent = Intent(Settings.ACTION_REQUEST_SCHEDULE_EXACT_ALARM) startActivity(intent) } }

🔹 這段程式碼會引導使用者進入 系統設定頁面,手動允許應用程式使用精確鬧鐘。


3. 使用 setAndAllowWhileIdle() 來替代 (Android 6+ 可用)

如果你的鬧鐘不需要 極度精準的時間,可以改用:

kotlin
alarmManager.setAndAllowWhileIdle( AlarmManager.RTC_WAKEUP, triggerTime, pendingIntent )

🔹 這樣就 不需要 SCHEDULE_EXACT_ALARM 權限,但 Android 6+ 進入 Doze 模式時,可能有誤差


結論

方法需要權限進入 Doze 模式後可用適用版本
setExact()SCHEDULE_EXACT_ALARM❌ 可能不執行Android 5+
setAndAllowWhileIdle()❌ 不需要權限✅ 允許低耗電模式Android 6+
setExactAndAllowWhileIdle()SCHEDULE_EXACT_ALARM✅ 允許低耗電模式Android 6+

👉 建議方案

  • 如果你 需要超精準的鬧鐘 → 使用 setExact() + SCHEDULE_EXACT_ALARM 並提示使用者授權

  • 如果 允許些微時間誤差 → 直接使用 setAndAllowWhileIdle()不需要額外權限 🎯

為何出現此錯誤訊息?No value passed for parameter 'appUpdateType'

 這個錯誤是因為在使用 AppUpdateOptions 時,未正確傳遞 appUpdateType 參數。從你提供的錯誤信息來看,你在創建 AppUpdateOptions 時需要傳遞一個 appUpdateType

在最新的 AppUpdateManager API 中,更新流程的構建需要明確指定更新類型。你應該在構建 AppUpdateOptions 時傳遞 appUpdateType 參數。

修正方案:

你應該像這樣設置 appUpdateType,使用 AppUpdateType.IMMEDIATE 或者 AppUpdateType.FLEXIBLE 來指定更新的類型。

修改後的代碼:

kotlin
private fun handleAppUpdate(appUpdateInfo: AppUpdateInfo) { val currentVersionCode = getCurrentAppVersionCode() // 檢查更新狀態,並比較版本碼 if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE && appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE) && appUpdateInfo.availableVersionCode() > currentVersionCode ) { try { // 創建 AppUpdateOptions,並設置更新類型 val appUpdateOptions = AppUpdateOptions.newBuilder() .setAppUpdateType(AppUpdateType.IMMEDIATE) // 設定即時更新 .build() // 使用 AppUpdateOptions 配置來進行即時更新 appUpdateManager.startUpdateFlow( appUpdateInfo, // 傳遞更新資訊 this, // 傳遞 Activity appUpdateOptions // 傳遞 AppUpdateOptions ) } catch (e: Exception) { // 處理錯誤 Toast.makeText(this, "啟動更新時發生錯誤: ${e.message}", Toast.LENGTH_LONG).show() } } }

主要更新:

  • appUpdateOptions 現在明確設置了 appUpdateType 參數,這樣可以正確傳遞更新類型。

注意:

  • AppUpdateType.IMMEDIATE 是即時更新,表示應用會強制更新並中斷當前操作。如果你希望使用彈性更新(即不強制要求用戶立刻更新),可以使用 AppUpdateType.FLEXIBLE

為何出現此錯誤訊息?Type mismatch: inferred type is Int but Activity was expected。Type mismatch: inferred type is MainActivity but AppUpdateOptions was expected

 這兩個錯誤是由於 startUpdateFlow() 方法的參數類型不匹配引起的。下面我會針對這兩個錯誤進行修正。

錯誤 1: Type mismatch: inferred type is Int but Activity was expected

  • 這個錯誤是由於傳遞的參數 AppUpdateType.IMMEDIATE 應該是更新類型,而 startUpdateFlow() 需要傳遞一個 Activity 作為參數。通常這個錯誤會出現在 startUpdateFlow() 的方法調用中,你可能錯誤地傳遞了錯誤的類型。

錯誤 2: Type mismatch: inferred type is MainActivity but AppUpdateOptions was expected

  • 第二個錯誤是由於 AppUpdateManager.startUpdateFlow() 方法需要使用 AppUpdateOptions,而不是傳遞 Activity 作為參數。這是因為新版的 API 使用 AppUpdateOptions 來處理更新的配置。

修改方案:

  1. 錯誤 1:確保你正確傳遞了 Activity 類型,而不是錯誤的參數。

  2. 錯誤 2:需要創建 AppUpdateOptions 來配置更新選項。

修正後的代碼:

kotlin
private fun handleAppUpdate(appUpdateInfo: AppUpdateInfo) { val currentVersionCode = getCurrentAppVersionCode() // 檢查更新狀態,並比較版本碼 if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE && appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE) && appUpdateInfo.availableVersionCode() > currentVersionCode ) { try { // 創建 AppUpdateOptions 來配置更新選項 val appUpdateOptions = AppUpdateOptions.newBuilder() .setAppUpdateType(AppUpdateType.IMMEDIATE) // 設定即時更新 .build() // 使用 AppUpdateOptions 配置來進行即時更新 appUpdateManager.startUpdateFlow( appUpdateInfo, // 傳遞更新資訊 this, // 傳遞 Activity appUpdateOptions // 配置 AppUpdateOptions ) } catch (e: Exception) { // 處理錯誤 Toast.makeText(this, "啟動更新時發生錯誤: ${e.message}", Toast.LENGTH_LONG).show() } } }

主要更改:

  1. 創建 AppUpdateOptions

    • 我們使用 AppUpdateOptions.newBuilder() 來構建更新配置,並設置更新類型(這裡使用 IMMEDIATE 即時更新)。

  2. 傳遞 AppUpdateOptions 參數

    • startUpdateFlow() 方法中,我們需要傳遞 AppUpdateOptions 作為一個參數,這樣可以正確啟動更新流程。

測試更新:

  • 嘗試這樣的修改後,再次測試你的應用,看看是否能夠正確啟動更新流程。如果還有其他錯誤或疑問,請告訴我,我將幫助你進一步調整!

excel 最大值用max,取最小值但要排除0,要怎麼寫?

 =MIN(IF(A1:A10<>0, A1:A10))